数组中出现次数超过一半的数字
题目描述:
解题思路:
思路一:中位数原理
- 现在的情况是,数组中有一个元素的出现次数超过了数组长度的一半,那么我们就可以想到了,如果把这个数组排序的话,那么排序之后的数组,位于数组中央的位置的那个元素一定是那个出现次数超过数组长度一半的元素,也就是说,这个数字是统计学上中位数,即长度为n的数组中第n/2大的元素,所以我们的想法就是先对数组中的元素进行排序,然后返回排好序的数组中第n/2位置上的元素就可以了,就找到了那个元素
- 代码如下:
class Solution {
public:
int majorityElement(vector<int>& nums)
{
sort(nums.begin(),nums.end());
return nums[nums.size()/2];
}
};
思路二:(类似于思路一)
- 先进行排序,然后遍历进行比较,如果相等的话,就给个数加1,不相等的话,就继续向后寻找看。
class Solution
{
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
int count = 1;
int num = numbers.size();
sort(numbers.begin(),numbers.end());
if(num == 0)
{
return 0;
}
if(num == 1)
{
return numbers[0];
}
int temp = numbers[0];
for(int i=1; i<num; ++i)
{
if(temp==numbers[i])
{
++count;
if(count>num/2)
{
return temp;
}
}
else
{
count = 1;
temp = numbers[i];
}
}
return 0;
}
};
思路三:哈希表
- 使用unordered_map数据结构,扫一遍给定数组,存储每个数字出现的次数。
- 再扫一遍哈希表,找出出现次数超过一半的数字
class Solution {
public:
int majorityElement(vector<int>& nums)
{
unordered_map<int,int>mp;
for(auto i : nums)
{
mp[i]++;
if(mp[i]>nums.size()/2)
return i;
}
return 0;
}
};
测试用例
- 功能测试:输入的数组中存在一个出现次数超过数组长度一半的数字,输入的数组不存在一个出现次数超过数组长度一半的数字
- 特殊输入测试:输入的数组中只有一个数字,输入nullptr指针