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

2021-10-05 05:17:32 字數 1473 閱讀 2064

實現

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

重要前提:如果乙個數字重複次數超過陣列長度的一半,則陣列中間數肯定是該重複的數字。

因此可以有如下思路:

利用快排的partition 函式不斷找到 位於 陣列中位數的 pivot。

如果partition返回的 index 在 mid 左邊,則在 [index+1, right]繼續找

如果partition返回的 index 在 mid 右邊,則在[left, index-1]繼續找

index==mid,返回

如果該 pivot在陣列中重複次數真的大於 一半,輸出,

否則,輸出無。

還有另乙個思路:

相同數字抵消的思想。

維持乙個當前數字 t 和 當前數字次數 n。

初始化時,t為 arr[0], n=1

繼續往下走,如果arr[i] 與 t 相同,則 n+1, 如果不相同,n-1

如果n==0, 則 t 變為 該數字, n + 1

結束:程式設計時 有兩個錯誤:

left = pindex+1; 和 right = pindex-1; ,當時沒有加1和減1,造成不斷迴圈,找到pindex一直不變。

if(times<=mid) 沒有加等於,導致 size為9的陣列,重複數字為4時,沒返回不存在。最好的寫法應該是times*2>length。

//思路1實現

class

solution

numbers[left]

= pivot;

return left;

}int

morethanhalfnum_solution

(vector<

int> numbers)

else

}int targetnum = numbers[pindex]

;int times =0;

for(

auto t : numbers)

if(times<=mid)

//注意臨界值判斷,其實 if(!(2*times>length))更直觀

return0;

return targetnum;}}

;

//思路2實現

class

solution

else}if

(n<=0)

return0;

int times =0;

for(

auto val:numbers)if(

2*times>numbers.

size()

)return target;

else

return0;

}};

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

題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0.思路一 把陣列排好序,出現次數超過一半的數一定是排好序陣列的中位數。然後取中位數,計算它出現的次數是否超過陣列長度的一半。...

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

題目 陣列中有乙個陣列出現的次數超過了陣列長度的一半,找出這個數字。答 include stdafx.h include using namespace std 查詢陣列中超過出現次數超過一半的數字 int findnumber int arr,int length int nvalue arr 0...

出現次數超過一半的數字

題目 陣列中有乙個數字出現的次數超過了陣列長度的一半,找出這個數字。乙個陣列中有很多數,現在我們要找出其中那個出現次數超過總數一半的數字,怎麼找呢?大凡當我們碰到某乙個雜亂無序的東西時,我們人的內心本質期望是希望把它梳理成有序的。所以,我們得分兩種情況來討論,無序和有序。如果無序,那麼我們是不是可以...