169.多數元素
229.求眾數 ii
摩爾投票法基於這樣乙個事實,當乙個數的重複次數超過陣列長度的一半,每次將兩個不相同的數刪除,最終剩下的就是要找的數。
為了解釋清楚這個問題,首先來看leetcode的第169題。
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數大於 ⌊ n/2 ⌋ 的元素。解決這個題的思路是這樣的:你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。
示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
我們維護乙個計數器,如果遇到乙個我們目前的候選眾數,就將計數器加一,否則減一。只要計數器等於 0 ,我們就將 nums 中之前訪問的數字全部 忘記 ,並把下乙個數字當做候選的眾數。這樣到最後,總能找到符合要求的數。為什麼呢?考慮這個問題:當我們「減到0重新換個數開始計數」,實際上我們從原陣列中忽略了2n個數,其中有n個是減到零之前那個候選的數,另外n個數不知道是什麼數,反正不是那個候選的數。也就是說,可以看作刪掉了n組元素,每組元素包括兩個元素,這兩個元素是不同的。
這一過程可以看作「抵消」。什麼意思呢,最差情況下,每一對中都有乙個眾數,那麼乙個眾數抵消乙個非眾數,由於本題中的眾數是大於出現次數一半的,所以抵消之後,剩下的陣列中,眾數的值不受影響。因此,到最後還剩乙個或幾個數,一定是眾數。
class solution:
def majorityelement(self, nums: list[int]) -int:
count = 0
for num in nums:
if count == 0:
candidate = num
count = count + 1 if candidate == num else count - 1
return candidate
到這裡還比較好理解。下面是乙個擴充套件:leetcode第229題。
給定乙個大小為 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:
def majorityelement(self, nums: list[int]) -> list[int]:
count1,count2 = 0,0
num1,num2 = none,none
for num in nums:
if num == num1:
count1 += 1
elif num == num2:
count2 += 1
elif count1 == 0:
num1 = num
count1 += 1
elif count2 == 0:
num2 = num
count2 += 1
else:
count1 -= 1
count2 -= 1
count1,count2 = 0,0
for num in nums:
if num == num1: count1 += 1
if num == num2: count2 += 1
return [i[0] for i in list(zip([num1,num2],[count1,count2])) if i[1] > len(nums) // 3]
LeetCode實戰 求眾數
you may assume that the array is non empty and the majority element always exist in the array.example 1 input 3 2,3 output 3example 2 input 2 2,1 1,1 ...
總結篇 求眾數
numpy.bincount 解釋 一句話版 返回從0到陣列中最大值,每個值在陣列 現的次數 形象版 對於陣列 11,4,4,11,3,9,8 看做是編號分別為11,4,4,11,3,9,8的7個小球。為了將小球歸置整齊,需要放到對應編號的桶中,小球的最大編號為11,所以需要11 1 12個桶,同樣...
leetcode 演算法 求眾數 169
leetcode 傳送門 給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在眾數。示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 本題是求陣列 現次數大於一半的元素。乙個基...