問題描述:給定乙個陣列,找出陣列**現次數超過陣列長度一半的數字
思路分析:
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查詢是...