1. 程式人生 > >LC-229 找眾數2

LC-229 找眾數2

2個 兩個 quest () 鏈接 href majority tps 解析

主要問題:

輸入一個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 };

LC-229 找眾數2