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 };