LC-229 找众数2

主要问题:

输入一个n个数的数组,找出数组里个数超过n/3的数字。

 

主要思路:

从题目的信息里,超过n/3的数字,一个n个数的数组里,最多只能存在2个,所以我们借鉴基础的摩尔投票算法,用两个候选来记录可能是n/3的数字,最后再根据这2个候选来计算这两个数字的具体在数组里的个数是否超过n/3。

而摩尔投票算法的解析,大家可以参考这个链接:如何理解摩尔投票算法 

具体思路,就是用一个变量来记录候选词,另一个变量来记录这个候选词的次数。然后在便利数组的时候,如果次数为0,则记录这个数字到候选词。如果下一个数字与候选词不相等,则抵消掉,次数减一。如果下一个相等,则次数加一。

 

代码:

 1 class Solution {
 2 public:
 3     vector<int> majorityElement(vector<int>& nums) {
 4         vector<int> answer;
 5         int count_1 = 0, count_2 = 0, candidate_1 = 0, candidate_2 = 1;
 6         for (int i = 0; i < nums.size(); i++) {
 7             if (nums[i] == candidate_1)
 8                 count_1++;
 9             else if (nums[i] == candidate_2)
10                 count_2++;
11             else if (count_1 == 0) {
12                 candidate_1 = nums[i];
13                 count_1 = 1;
14             }
15             else if (count_2 == 0) {
16                 candidate_2 = nums[i];
17                 count_2 = 1;
18             }
19             else {
20                 count_1--;
21                 count_2--;
22             }
23         }
24         count_1 = count_2 = 0;
25         for (int i = 0; i < nums.size(); i++) {
26             if (nums[i] == candidate_1) count_1++;
27             else if (nums[i] == candidate_2) count_2++;
28         }
29         if (count_1 > nums.size() / 3)
30             answer.push_back(candidate_1);
31         if (count_2 > nums.size() / 3)
32             answer.push_back(candidate_2);
33         return answer;
34     }
35 };

 

posted @ 2019-02-28 14:35  leo_lee  阅读(116)  评论(0编辑  收藏  举报