題目
給定整數陣列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
(cand)
else
("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:
("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:
("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...