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...