leetcode169求眾數python實現

2021-09-26 00:26:22 字數 1687 閱讀 1535

169求眾數 簡單 分治演算法

給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列**現次數大於 ⌊ n/2 ⌋ 的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在眾數。

1.方法一遍歷:首先想到的方法是將陣列的所有元素遍歷,計算每個元素出現的次數,最後返回出現次數最多的元素,即為眾數。

class solution:

def majorityelement(self, nums: list[int]) -> int:

n = len(nums)

#出現次數

count = 0

for i in range(n):

for j in range(n):

if(nums[i]==nums[j]):

count+=1

if (count>n/2):

return (nums[i])

一開始不停報錯因為我把count+=1寫成了count++,但是python中是沒有自增自減的,原因參考(

python中的數字型別是不可變資料。意思說的是數字型別資料在【記憶體】中是不會發生改變,當變數值發生改變時,會新申請一塊記憶體賦值為新值,然後將變數指向新的記憶體位址。

a = 10

id(a)

140698656902112

a = a+1

id(a)

140698656902144

可以看到當a的值發生改變時,a指向的記憶體位址也發生了改變。而在c語言中,a指向的記憶體位址並不會發生改變,而是改變記憶體的內容。

從這裡就可以理解為什麼」自增」為什麼在python中不存在。++代表改變了物件本身,而python中數字型別是不可變,所以自增是不存在的。

答案寫的要簡潔許多

2.方法二排序法:觀察題目可知,題目中對眾數的出現次數進行了限定,大於(n/2),所以如果將陣列排序無論公升序降序,第n/2個位置的數一定是眾數,n可能為奇數n/2要取整。

感覺這種方法很巧妙哎(參考題解)

class solution:

def majorityelement(self, nums: list[int]) -> int:

# 將列表直接排序

nums.sort()

index=len(nums)//2

return nums[index]

3.方法三雜湊表統計陣列中每個元素出現的個數,元素為鍵,元素個數為鍵值,最後返回鍵值最大的元素即可

class solution:

def majorityelement(self, nums: list[int]) -> int:

counts = collections.counter(nums)

return max(counts.keys(),key=counts.get)

collections.counter這個函式真的是非常有用了,是用來統計個數的~返回的是乙個dict,key是各個元素,value是對應的個數

對於這個函式的使用可以參考(

LeetCode169求眾數 分治

給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 n 2 的元素。你可以假設陣列是非空的,並且陣列中的眾數永遠存在。將每個數字彷彿雜湊表中,記數,直到某個數的count n 2。時間複雜度為o n 因為眾數是出現次數大於n 2的數字,所以排序之後中間的那個數字一定是眾數。即n...

求眾數leetcode 169 投票演算法

求眾數 解題思路 boyer moore kmp class solution count conditate nums i 1 1 return conditate 求眾數2 題目 給定乙個大小為 n 的陣列,找出其中所有出現超過 n 3 次的元素 解題思路 投票演算法 class solutio...

leetcode 演算法 求眾數 169

leetcode 傳送門 給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在眾數。示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 本題是求陣列 現次數大於一半的元素。乙個基...