打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
剑指offer(C++)-JZ39:数组中出现次数超过一半的数字(算法-其他)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n≤50000,数组中元素的值 0≤val≤10000

要求:空间复杂度:O(1),时间复杂度 O(n)

输入描述:

保证数组输入非空,且保证有解

示例:

输入:

[1,2,3,2,2,2,5,4,2]

返回值:

2

解题思路:

本题考察算法思维。三种解题思路:

1)排序法

       因为数字出现次数超过数组长度的一半,那它存在则必然出现在数组的中位,先进行一次排序,取中位数即可。

2)排序法进阶

       因为题目设定是保证有解,假设不保证有解,则在原排序法的基础上,增加对中位数出现次数的统计,若符合要求输出,不符合返回0。

3)哈希法

       利用哈希表对数字出现次数进行统计,次数满足要求的输出。

测试代码:

1)排序法

class Solution {
public:
    // 次数超过一半的数字
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        sort(numbers.begin(), numbers.end());
        return numbers[numbers.size() / 2];
    }
};

2)排序法进阶

class Solution {
public:
    // 次数超过一半的数字
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        sort(numbers.begin(), numbers.end());
        int size = int(numbers.size());
        int med = numbers[size / 2];
        int count = 0;
        for(int i = 0; i < size; ++i){
            if(numbers[i] == med){
                count++;
            }
        }
        if(count > size / 2){
            return med;
        }
        else{
            return 0;
        }
    }
};

 3)哈希法

class Solution {
public:
    // 次数超过一半的数字
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        unordered_map<int, int> m;
        for(auto i : numbers){
            m[i]++;
        }
        for(auto i : numbers){
            if(m[i] > numbers.size() / 2){
                return i;
            }
        }
        return 0;
    }
};
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
算法57(数组中超过出现次数超过一半的数字)
【算法千题案例】⚡️每日LeetCode打卡⚡️——53.两个数组的交集 II
剑指offer之圆圈最后剩下的数
剑指offer 28 数组中出现次数超过一半的数字
【Java基础 3】Java 数组详解
冒泡排序法的原理与举例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服