LeetCode演算法題169:求眾數解析
阿新 • • 發佈:2018-11-11
給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設陣列是非空的,並且給定的陣列總是存在眾數。
示例1:
輸入: [3,2,3]
輸出: 3
示例2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
這個題可以直接設定一個雜湊表字典去計數每一個值出現的次數然後取次數最多的數,但是試過之後發現超過空間限制,說明還是限制了空間複雜度。因此上網搜尋後發現一種方法叫摩爾投票法,這種方法就是因為題目給出一定存在一個數其個數是大於n/2的,所以設定一個投票計數器,選定第一個值作為起始值,然後後面的值如果是這個值那麼計數加一,如果不等,那麼計數減一,當計數器的值為零時,選取當前值作為新值繼續計數。這樣最後計數器不為零對應的值一定是出現次數大於一半的值。
C++原始碼:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int result = 0;
int count = 0;
for (int i:nums)
{
if (result == i) count++;
else if(count!=0) count--;
else
{
result = i;
count = 1;
}
}
return result;
}
};
python3原始碼:
class Solution:
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
result = 0
count = 0
for i in nums:
if count == 0:
result = i
count = 1
elif result == i:
count += 1
else:
count -= 1
return result