在陣列中找到出現次數大於N K的數

2021-10-01 05:51:37 字數 2034 閱讀 1757

題目

給定整數陣列arr,列印其**現次數大於一半的數, 如果沒有這樣的數,列印提示資訊。

高階問題:

給定整數陣列arr,列印其**現次數大於n/k的數,如果沒有這樣的數,列印提示資訊。

要求

原問題要求時間複雜度o(n), 空間複雜度o(1),

高階問題要求時間複雜度o(n×k),額外空間o(k)

解答

核心思路:一次在陣列中刪掉k個不同的數,不停地刪除,直到剩下數的種類不足k就停止刪除,那麼,如果乙個數在陣列**現次數大於n/k,則這個數最後一定會被剩下來。

注:這裡有乙個很重要的事實,那就是出現次數大於n/k的元素的個數至多為(k-1)個,比如出現次數大於n/3的至多只有兩個。

原問題**:

def

printhalfmajor

(arr)

: cand =

0 times =

0for i in arr:

if times==0:

cand = i

times +=

1elif i == cand:

times +=

1else

: times -=

1

times =

0for i in arr:

if i == cand:

times +=

1if times >

int(

len(arr)/2

):print

(cand)

else

:print

("no such number."

)

高階問題**:

思路:

1.遍歷arr,看arr[i]是否在候選中,如果在對應統計數加1, 如果不在,先看候選是否滿了,k-1就是滿,否則不滿

2. 如果不滿,arr[i]作為先的候選,對應統計數初始化為1

3. 如果已滿,說明此時發現了k個不同的數,arr[i]就是第k個,此時把每乙個候選各自的統計數全部減1,表示每個候選付出自己的乙個統計數。如果某些候選減1後等於0,則還要把這些候選都刪除,cand又變成不滿狀態。

import copy

defprintkmajor

(arr, k)

:if k <2:

print

("k is invalid"

) cand =

times =

0for i in arr:

if i in cand:

cand[i]+=1

else:if

len(cand)

< k-1:

cand[i]

= cand.get(i,0)

+1else

: times +=

1 cand2 = copy.deepcopy(cand)

for k,v in cand2.items():

cand[k]-=1

if cand[k]==0

:del cand[k]

count =

0for kk,v in cand.items():

v = v + times

if v >

len(arr)

/k: count +=

1print

(kk)

if count ==0:

print

("no such number."

)printhalf([1

,1,1

,3,3

,3],

3)

在陣列中找到出現次數大於n k的數

在陣列中找到出現次數大於n k的數 給定乙個整型陣列arr,再給定乙個整數k,列印所有出現次數大於n k的數,如果沒有這樣的數,請列印 1 輸入描述 輸入包含兩行,第一行輸入包含兩個整數n和k 1 k n 105 1 leq k leq n leq 10 5 1 k n 105 第二行包含n個整數,...

在陣列中找到出現次數大於一半的數

在陣列中找到出現次數大於一半的數 給定乙個整型陣列arr,請列印其 現次數大於一半的數,如果沒有這樣的數,請輸出 1。輸入描述 輸入包含兩行,第一行包含乙個整數n 1 n 1 05 n 1 leq n leq 10 5 n 1 n 105 代表陣列長度,第二行包含n個數,代表陣列arr 1 a rr...

在陣列中找到出現頻率大於1 4的數

演算法的核心思想很簡單,每次刪去不同的4個數,最後剩下的元素有可能是頻繁項。假設陣列有15個元素,若乙個元素的出現頻率大於1 4,其必須出現4次。不妨設陣列為,d表示刪去該數。我們來模擬一下演算法的過程。第一次 1d,2d,1,4d,1,4,2,9d,1,7,4,3,9,4,3 剩下 1,1,4,2...