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

2021-09-05 07:06:57 字數 1691 閱讀 4207

題目

給定乙個整形陣列arr,再給定乙個整數k,列印所有出現次數大於n/k的數,如果沒有這樣的數,列印提示資訊。

首先分析k=2這個特殊情況,有以下思路:

排序後,取陣列中間的數。但該方法的時間複雜度為排序演算法的時間複雜度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個整數,...