python求众数代码_python-LeetCode-求众数
題目:給定一個(gè)大小為 n 的數(shù)組,找到其中的眾數(shù)。眾數(shù)是指在數(shù)組中出現(xiàn)次數(shù)大于 ? n/2 ? 的元素。
你可以假設(shè)數(shù)組是非空的,并且給定的數(shù)組總是存在眾數(shù)。
示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
眾數(shù)——眾數(shù)(Mode)是統(tǒng)計(jì)學(xué)名詞,在統(tǒng)計(jì)分布上具有明顯集中趨勢(shì)點(diǎn)的數(shù)值,代表數(shù)據(jù)的一般水平(眾數(shù)可以不存在或多于一個(gè))。 修正定義:是一組數(shù)據(jù)中出現(xiàn)次數(shù)最多的數(shù)值,叫眾數(shù),有時(shí)眾數(shù)在一組數(shù)中有好幾個(gè)。用 M 表示。 理性理解:簡(jiǎn)單的說(shuō),就是一組數(shù)據(jù)中占比例最多的那個(gè)數(shù)。
(來(lái)自百度)
我的解法:利用字典,計(jì)算每一個(gè)數(shù)字出現(xiàn)的次數(shù),出現(xiàn)次數(shù)最大的那個(gè)就是要求的眾數(shù),但是根據(jù)題目,次數(shù)還要大于列表長(zhǎng)度的一半,所以有了下面的方法:
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
這種方法我借鑒了昨天的字典法,利用字典來(lái)計(jì)數(shù)。利用了額外字典空間,遍歷列表一次,字典一次。
當(dāng)然,昨天的count法也能完成,這題雖然沒(méi)有明確要求,但是我們總是要利用更小的時(shí)空復(fù)雜度來(lái)完成算法。
還有一種方法,我是沒(méi)想到,我發(fā)現(xiàn)大學(xué)上久了,那種投機(jī)取巧的本事丟了,思維有些不太靈活了,可能是不太動(dòng)腦子了吧。。
這種方法利用了這樣的方法,將給的列表排序,因?yàn)楸姅?shù)的數(shù)量超過(guò)一半,所以排序后,中間的數(shù)一定是那個(gè)眾數(shù)。只能說(shuō)我的腦子不行。
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort()
return nums[len(nums)//2]
還有一個(gè)我剛學(xué)會(huì)的方法——摩爾投票法
我借鑒了網(wǎng)上的解釋:摩爾投票法的基本思想很簡(jiǎn)單,在每一輪投票過(guò)程中,從數(shù)組中找出一對(duì)不同的元素,將其從數(shù)組中刪除。這樣不斷的刪除直到無(wú)法再進(jìn)行投票,如果數(shù)組為空,則沒(méi)有任何元素出現(xiàn)的次數(shù)超過(guò)該數(shù)組長(zhǎng)度的一半。如果只存在一種元素,那么這個(gè)元素則可能為目標(biāo)元素。
https://www.jianshu.com/p/c19bb428f57a
文章寫(xiě)的Java實(shí)現(xiàn)
但是我們不能真的去每次刪除兩個(gè)不相同的值,當(dāng)然如果你要寫(xiě)也能寫(xiě)出來(lái),這有個(gè)更好的方法:
從第一個(gè)數(shù)開(kāi)始count=1,遇到相同的就加1,遇到不同的就減1,減到0就重新?lián)Q個(gè)數(shù)開(kāi)始計(jì)數(shù),總能找到最多的那個(gè)。——YourBaymax
現(xiàn)在我們來(lái)用python來(lái)實(shí)現(xiàn)它:
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
這種方法是最快的,而且,只用了常數(shù)個(gè)空間來(lái)保存計(jì)數(shù)和待選眾數(shù)。
厲害!!這種方法我看了挺久的,腦子不行了。
總結(jié)
以上是生活随笔為你收集整理的python求众数代码_python-LeetCode-求众数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 澳门人均GDP比香港高,但为什么很多人感
- 下一篇: Web数据存储之localStorage