多数元素

多数元素

题目描述:

给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于\(\lfloor n/2\rfloor\)的元素。

你可以假设数组是非空的,并且给定数组总是存在多数元素。

示例1:

输入:[3,2,3]

输出:3

示例2:

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

输出:2

tips:要求时间复杂度O(n),空间复杂度O(1)

Solution:

方法1:随机化

每次随机的选取数组中的一个数,统计数量,直到找到过半的数。(期望时间复杂度为O(n),空间复杂度O(1))

Code:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        while(true) {
            int k = rand() % nums.size();
            int cnt = 0;
            for(auto e:nums) {
                if(nums[k] == e) cnt++;
            }
            if(cnt > nums.size() / 2) return nums[k];
        }
    }
};

方法2:Boyer-Moore投票算法

设置 candidate变量记录可能为众数的值,count记录该数出现次数,遍历数组

对于x:如果x等于candidate,则count+1;如果不等于candidate,则count-1,当count=0是candidate更新为x,最终candidate的值即为众数。

Code:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate, count = 0;
        for(auto e:nums) {
            if(count) {
                count += (candidate == e ? 1 : -1);
            }
            else {
                candidate = e;
                count++;
            }
        }
        return candidate;
    }
};
posted @ 2022-03-18 10:25  落水清心  阅读(36)  评论(0编辑  收藏  举报