題目首先分析k=2這個特殊情況,有以下思路:給定乙個整形陣列arr,再給定乙個整數k,列印所有出現次數大於n/k的數,如果沒有這樣的數,列印提示資訊。
排序後,取陣列中間的數。但該方法的時間複雜度為排序演算法的時間複雜度o(nlogn)。
一次在陣列中刪掉兩個不同的數,不停地刪除,直到剩下的數只有一種,一定是那個出現次數大於一半的數。
實現**:
/**
* 特例:找出出現次數大於一半的數
* * @param arr 待查陣列
*/public
void printhalfmajor (
int[
] arr)
else
if(arr[i]
== cand)
else
} times =0;
for(
int i =
0; i != arr.length; i++)}
if(times > arr.length /2)
else
}
拓展思路二,回到k為不定項的情況,類似地,只需要立k-1個候選,然後有k-1個times統計即可。
**實現如下:
public
void
printkmajor
(int
arr,
int k)
hashmap
cands =
newhashmap
<
>()
;for
(int i =
0; i != arr.length; i++
)else
else}}
//驗證
hashmap
reals =
getreals
(arr, cands)
;boolean hasprint =
false
;for
(map.entry
set : cands.
entryset()
)}system.out.
println
(hasprint ?"":
"no such number.");
}/**
* 每乙個候選的點數都減一,並剔除減後點數為0的候選
* * @param map 所有候選
*/public
void
allcandsminusone
(hashmap
map)
map.
put(key, value -1)
;}for(integer removekey : removelist)
}/**
* 得到所有候選的出現次數
* * @param arr 原陣列
* @param cands 所有候選
* @return map《候選數 , 出現次數》
*/public hashmap
getreals
(int
arr,
hashmap
cands)
else}}
return reals;
}
找出陣列中出現次數大於n 2 n 3,n k的數
1.找出陣列中次數大於n 2的元素 說明 演算法空間複雜度o n 時間複雜度o 1 陣列中次數超過n 2的數最多1個,設定乙個頻率數,前乙個數和後乙個數相同,頻率 1,否則 1,只要有數頻率超過陣列長度一半,最終這個頻率肯定大於0.public static intsolve2 int array ...
在陣列中找到出現次數大於N K的數
題目 給定整數陣列arr,列印其 現次數大於一半的數,如果沒有這樣的數,列印提示資訊。高階問題 給定整數陣列arr,列印其 現次數大於n k的數,如果沒有這樣的數,列印提示資訊。要求 原問題要求時間複雜度o n 空間複雜度o 1 高階問題要求時間複雜度o n k 額外空間o k 解答 核心思路 一次...
在陣列中找到出現次數大於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個整數,...