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