找出陣列中出現次數大於n 2 n 3,n k的數

2021-09-17 23:18:35 字數 1596 閱讀 5742

1.找出陣列中次數大於n/2的元素

說明:演算法空間複雜度o(n),時間複雜度o(1)

陣列中次數超過n/2的數最多1個,設定乙個頻率數,前乙個數和後乙個數相同,頻率+1,

否則-1,只要有數頻率超過陣列長度一半,最終這個頻率肯定大於0.

public

static

intsolve2

(int

array)

else

} time =0;

for(

int i =

0;i(time>array.length/2)

return temp;

return-1

;}

2.找出陣列**現次數超過n/3的數

超過n/2的數,最多2個,可以設定兩個臨時變數儲存陣列元素,兩個頻率變數

public

static arraylist solve

(int

array)

else

if(count2<=0)

else

} count1 = count2 =0;

for(

int i =

0;i(count1>len/

3) list.

add(maj1);if

(count2>len/

3) list.

add(maj2)

;return list;

}

3.找出陣列個數大於n/k的

大於n/k的最多也就是k-1個,所以map集合每當滿k-1個的時候,如果,前後不相等,集合內所有的元素個數都要-1,為0的清除掉。

public

static

void

solve3

(int

arr,

int k)

else

else}}

//將map裡所有數的個數即value都清0,因為map中的數並非都符合要求

map.

keyset()

.foreach

(integer-

>map.

replace

(integer,0)

);//再次迴圈統計map裡數字的真正個數

for(

int num:arr)

} map.

foreach

((key,value)

->})

;}private

static

void

subtrackall

(map

map,

int k)

else map.

replace

(integer, integer2-1)

;});

if(list.

size()

!=0)}

}

為什麼最後還要驗證一下,例如找大於n/2的數,陣列為 2 2 2 3 3 3 最終temp為3但是顯然3個數並沒有大於n/2

求陣列中出現次數大於陣列長度一半元素

最近聽參加今年研究生考試的同學說了這樣一道演算法題 已知乙個整數陣列,讓你判斷其中是否存在出現次數大於陣列長度一半的元素,如果存在的話輸出其中第一次出現該元素時陣列的下標 如果不存在的話,輸出 1。這讓我想到了在 程式設計之美 上看到的乙個幾乎類似的題目 尋找發帖的 水王 只不過 程式設計之美 上的...

找出陣列中出現次數超過一半的數

分析 最直接的方法,對陣列中所有的數排序,然後再掃瞄一遍,統計各個數出現的次數。如果某個數出現的次數超過一半,則輸出這個數。演算法的時間複雜度是o n log 2n n 如果每次刪除兩個不同的數,那麼,在剩下的數字裡,超過一半的數的個數一樣超過了50 不斷重複這個過程,最後剩下的即 為所求。無需避免...

找出陣列中出現次數超過一半的數字

題目 陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。解法1 將陣列利用快速排序進行排序,因為陣列中有乙個數字出現的次數超過了陣列長度的一半,則排序以後直接取得最中間的那個數字即可!時間複雜度為 o n logn 因為時間主要花費在快速排序上面了!public static int f...