python求众数代码_python-LeetCode-求众数
題目:給定一個大小為 n 的數組,找到其中的眾數。眾數是指在數組中出現次數大于 ? n/2 ? 的元素。
你可以假設數組是非空的,并且給定的數組總是存在眾數。
示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
眾數——眾數(Mode)是統計學名詞,在統計分布上具有明顯集中趨勢點的數值,代表數據的一般水平(眾數可以不存在或多于一個)。 修正定義:是一組數據中出現次數最多的數值,叫眾數,有時眾數在一組數中有好幾個。用 M 表示。 理性理解:簡單的說,就是一組數據中占比例最多的那個數。
(來自百度)
我的解法:利用字典,計算每一個數字出現的次數,出現次數最大的那個就是要求的眾數,但是根據題目,次數還要大于列表長度的一半,所以有了下面的方法:
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dict={x:0 for x in nums}
for x in nums:
dict[x]+=1
for x in dict.key():
if dict[x]>len(nums)//2:
return x
這種方法我借鑒了昨天的字典法,利用字典來計數。利用了額外字典空間,遍歷列表一次,字典一次。
當然,昨天的count法也能完成,這題雖然沒有明確要求,但是我們總是要利用更小的時空復雜度來完成算法。
還有一種方法,我是沒想到,我發現大學上久了,那種投機取巧的本事丟了,思維有些不太靈活了,可能是不太動腦子了吧。。
這種方法利用了這樣的方法,將給的列表排序,因為眾數的數量超過一半,所以排序后,中間的數一定是那個眾數。只能說我的腦子不行。
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
return nums[len(nums)//2]
還有一個我剛學會的方法——摩爾投票法
我借鑒了網上的解釋:摩爾投票法的基本思想很簡單,在每一輪投票過程中,從數組中找出一對不同的元素,將其從數組中刪除。這樣不斷的刪除直到無法再進行投票,如果數組為空,則沒有任何元素出現的次數超過該數組長度的一半。如果只存在一種元素,那么這個元素則可能為目標元素。
https://www.jianshu.com/p/c19bb428f57a
文章寫的Java實現
但是我們不能真的去每次刪除兩個不相同的值,當然如果你要寫也能寫出來,這有個更好的方法:
從第一個數開始count=1,遇到相同的就加1,遇到不同的就減1,減到0就重新換個數開始計數,總能找到最多的那個。——YourBaymax
現在我們來用python來實現它:
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count=0
now=None
max=len(nums)/2
for i in nums:
if count==0:
now=i
count=1
elif count>max:
return now
elif i==now:
count+=1
else:
count-=1
return now
這種方法是最快的,而且,只用了常數個空間來保存計數和待選眾數。
厲害!!這種方法我看了挺久的,腦子不行了。
總結
以上是生活随笔為你收集整理的python求众数代码_python-LeetCode-求众数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 澳门人均GDP比香港高,但为什么很多人感
- 下一篇: 外部函数能修改闭包内的变量_Python