LeetCode 169求众数

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来做的方法,错误我还是没太懂,后续懂了回来更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值