1. 程式人生 > >【LeetCode】229. 求眾數 II 結題報告 (C++)

【LeetCode】229. 求眾數 II 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/majority-element-ii/submissions/

題目描述:

給定一個大小為 n 的陣列,找出其中所有出現超過 ⌊ n/3 ⌋ 次的元素。

說明: 要求演算法的時間複雜度為 O(n),空間複雜度為 O(1)。

示例 1:

輸入: [3,2,3]
輸出: [3]
示例 2:

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

 

解題方案:

在上一題的基礎上,繼續採用摩爾投票法。

程式碼:

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans;
        int result1 = 0, result2 = 0, count1 = 0, count2 = 0;
		for (int x : nums) {
			if (x == result1)
				count1++;
			else if (x == result2)
				count2++;
			else if (count1 == 0) {
				result1 = x;
				count1 = 1;
			} else if (count2 == 0) {
				result2 = x;
				count2 = 1;
			} else {
				count1--;
				count2--;
			}
		}
		count1 = count2 = 0;
		for(int x : nums) {
			if(x == result1)
				count1++;
			if(x == result2)
				count2++;
		}
		if(count1 > (nums.size()/3))
			ans.push_back(result1);
		if((count2 > (nums.size()/3)) && (result2!=result1))
            ans.push_back(result2);
        
        return ans;
    }
};