LeetCode 169求众数
题目
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
此题,我最开始看到第一反应就是用map来统计每个数字出现的次数,然后在遍历此map来查找到其中次数超过一半的那个数,这种思路是行得通的,但是code过程中一直有一个错误
当时编写的代码如下:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int len=nums.size();
int num=len/2;
map<int,int> a;
a[nums[0]]=1;
for(int i=1;i<len;i++){
if(a.find(nums[i])==a.end()){
//a.insert(nums[i],1);
a[nums[i]]=1;
}else{
a[nums[i]]++;
}
}
//遍历map,找出其中value大于等于num的key
map< int,int>::iterator iter;
for(iter = a.begin(); iter != a.end(); iter++){
if(iter->second>num){
return iter->first;
}
}
}
};
报错提示为:
第六行 出错:control reaches end of non-void function[-Werror=return_type] map<int,int> a;
没太懂
然后用了另一种方法来做,直接用一个数组来存储给定数组的第一个数字和这个数字出现的次数1,然后遍历数组一遍,每遍历一个数,如果相同,次数就加一,如果不是就减一,如果次数减到0了,就换下一个数组中的数字和次数来存储,遍历完成后,返回数组存储的数字就是了。思想就是,众数对于一半,那么一次众数就可以和一次非众数相抵消,到最后未抵消的就一定是众数。思路比较简单,代码编写也很容易。
代码
int majorityElement(int* nums, int numsSize){
int a[1][2];//用于存储一个值和它出现的次数
a[0][0]=nums[0];
a[0][1]=1;
for(int i=1;i<numsSize;i++){
if(a[0][1]==0){
a[0][0]=nums[i];
a[0][1]=1;
}else{
if(nums[i]==a[0][0]){
a[0][1]++;
}else{
a[0][1]--;
}
}
}
return a[0][0];
}
至于上面那个用map来做的方法,错误我还是没太懂,后续懂了回来更新。