leetcode階段總結 求眾數

2021-10-01 08:51:18 字數 1958 閱讀 6149

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 本題是求陣列 現次數大於一半的元素。乙個基...