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

2021-09-13 16:41:26 字數 1285 閱讀 2299

問題描述:給定乙個陣列,找出陣列**現次數超過陣列長度一半的數字

思路分析:

1)排序,如果存在這麼乙個數字,中位數一定是這個數字;時間複雜度o(nlog(n));

2)尋找中位數,基於快排partition思路,尋找中位數,首先隨機選擇乙個數字,把陣列中的數字進行調整,小於的放在左邊,大於等於的放在右邊,再判斷隨機數字在調整後的位置。如果是中間位置,就返回檢查;如果《中間位置,就從右半邊找;如果》中間位置,則從左半邊找;時間複雜度o(n)

3)乙個數超過出現次數超過長度的議案,則它的出現次數 > 其他數字的出現次數之和,每次從陣列中去掉兩個不同的值,則最後剩下的一定是這個數,遍歷陣列,儲存乙個數值val和乙個計數cnt,當碰到當前數cur和val不一樣時,則cnt–(這裡相當於去掉了val和cur兩個不同的值),如果cnt = 0, 則儲存val = cur, cnt =1;時間複雜度o(n)

// 2)基於partition方法

class

solution}}

++small;

swap

(num[small]

, num[end]);

return small;

//返回樞紐元當前位置

}int

morethanhalfnum_solution

(vector<

int> numbers)

else

}int result = numbers[middle]

;int cnt =0;

for_each

(numbers.

begin()

, numbers.

end(),

[result,

&cnt]

(int n));

// cout << "result:" << result << ", " << cnt << endl;

if(cnt *

2> numbers.

size()

)return result;

return0;

}};// 3)

class

solution

else

} cnt =0;

for(

int i =

0; i < numbers.

size()

; i++

)return cnt > numbers.

size()

/2? cur :0;

}};

劍指offer 陣列在排序陣列中出現的次數

記錄次數,直接用data.count k 也通過了。或者常規演算法,出現有序用二分查詢。class solution def getnumberofk self,data,k write code here if len data 0 return 0 count 0 low 0 high len ...

劍指offer第39 陣列中出現次數超過一半的數字

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

劍指Offer 028陣列中出現次數超過一半的陣列

028陣列 現次數超過一半的陣列 題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0 方法 map統計法 思路 遍歷陣列,用map來記錄每個數出現的次數,最後再遍歷map查詢是...