169-多数元素

169-多数元素

1.题目

LeetCode-169-多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

2.标准答案

LeetCode-169-多数元素-官方题解

暴力求解 O(n^2)

哈希函数 O(n)

数学方法

3.心得

这道题说白了就是求众数(而且限定好了非常舒服的条件范围)。
一般初见这题,初学者都会直接想到暴力解法,不多BB。
做了一定数量的简单题后,很容易会想到哈希表(比如我),但是哈希表会存在一个问题,就是会有额外的内存占用。
我一开始的想法是用逻辑运算去做,发现此路不通,查题解发现了一个利用题目要求的数学性质做的—Boyer-Moore 投票算法。

想法

如果我们把众数记为 +1+1 ,把其他数记为 -1−1 ,将它们全部加起来,显然和大于 0 ,从结果本身我们可以看出众数比其他数多。
即:在原序列中去除两个不同的元素后,原序列中的多数元素在新序列中还是多数元素。

算法

1)将数组的第一个元素设置为多数元素P,并记录count = 1
2)将数组后面的数与P比较,若相等count+1,不相等count-1
3)若count减到0,便表示该元素出现次数太少,将其和后面一个不相等的元素剔除,再次重置c和count
4)继续此操作,直到比较到最后count都不为0,则c就为多数元素。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        if(nums.size()==0||nums.size()==1) return nums[0];
        vector<int>::iterator iter=nums.begin();
        int last=*iter,cnt=0;
        iter++;
        while(iter!=nums.end())
        {
            if(cnt!=0)
            {
                if(*iter==last) cnt++;
                else cnt--;
            }
            else
            {
                if(*iter==last) cnt++;
                else last=*iter;
            }
            iter++;
        }
        return last;
    }
};
posted @ 2020-02-21 20:10  AAA_BiteTheDust  阅读(164)  评论(0)    收藏  举报