在陣列中找到出現次數大於一半的數

2021-10-25 05:35:42 字數 1473 閱讀 7747

在陣列中找到出現次數大於一半的數

給定乙個整型陣列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...