美文网首页
每日一题1. leetcode求众数

每日一题1. leetcode求众数

作者: Diane小山 | 来源:发表于2019-05-20 20:27 被阅读0次

    题目

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

    示例

    输入:[3,2,3]
    输出:3
    输入:[2,2,1,1,1,2,2]
    输出:2


    思路

    采用摩尔投票法:在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。

    因此代码思路如下:
    遍历整个数组,保持一个计数器count和一个变量num,选定第一个值作为num的初始值,如果后边的数和num相同,则count++,否则count--。当count==0时。用当前值作为新的num。最后的num即为众数。

    代码

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int count = 1;
            int num = nums[0];
            int len = nums.size();
            int i;
            for (i = 1; i < len; i++){
                if (num == nums[i])
                    count++;
                else{
                    count--;
                    if (count == 0){
                        num = nums[i];
                        count++;
                    }
                }
            }
            return num;
        }
    };
    

    最后

    想到了这样一个题目:
    村庄里有一个明星,其余的村民都认识他,但是他不认识其余任何人。 其余的村民可能互相认识。现在可以向上帝问xxx是否认识xxx,时间成本是O(1),现在应该怎样做,才能最快找出明星?

    相关文章

      网友评论

          本文标题:每日一题1. leetcode求众数

          本文链接:https://www.haomeiwen.com/subject/peplzqtx.html