在陣列中找到出現次數大於一半的數
給定乙個整型陣列arr,請列印其**現次數大於一半的數,如果沒有這樣的數,請輸出-1。
輸入描述:
輸入包含兩行,第一行包含乙個整數n(1
≤n≤1
05
)n(1 \leq n \leq 10^5)
n(1≤n≤
105)
代表陣列長度,第二行包含n個數,代表陣列arr
(1≤a
rri≤
109)
arr(1 \leq arr_i \leq 10^9)
arr(1≤
arri
≤10
9)。輸出描述:
輸出乙個整數,代表出現次數大於一半的數,如果沒有這樣的數,請輸出『-1「。
示例1輸入
5
11 7 5 7 7
輸出7
示例2
輸入
4
2 2 3 3
輸出-1
備註:
時間複雜度o(n
)o(n)
o(n)
,額外空間複雜度o(1
)o(1)
o(1)
。題解:
常規解法可以嘗試使用雜湊表記錄每個元素出現的次數,但是額外空間複雜度不滿足題目要求。考慮乙個比較新穎的做法:每次我們刪除兩個不一樣的元素,如果序列中存在出現次數超過一半的元素,那麼該元素最後一定會被保留下來。這樣的話,我們可以只用兩個變數就搞定了(具體見**)。
注意:最後儲存的不一定是出現次數超過一半的元素,還需要在遍歷一邊陣列,確認一下。
**:
#include
using
namespace std;
const
int n =
100010
;int n;
int a[n]
;int
main
(void
)else
if( a[i]
== cand )
++times;
else
--times;}if
(!cand )
return0*
puts
("-1");
times =0;
int mid = n >>1;
for(
int i =
0; i < n && times <= mid;
++i ) times +
=( a[i]
== cand );if
( times > mid )
printf
("%d\n"
, cand)
;else
puts
("-1");
return0;
}
在陣列中找到出現次數大於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個整數,...
在陣列中找到出現頻率大於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...