Leetcode 劍指 Offer 39. 陣列中出現次數超過一半的數字
陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。
你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。
示例 1:
輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2
限制:
1 <= 陣列長度 <= 50000
方法一:利用 hashmap 儲存陣列中值的出現次數。先放C++程式碼,思路簡單易懂。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> match;
int len = nums.size(), res = 10086;
if(len == 1 || len == 2){
return nums[0];
}
for(int i = 0; i < len; ++i){
match[nums[i]] ++;
if(match[nums[i]] > (len / 2)){
res = nums[i];
break;
}
}
return res;
}
};
int main()
{
vector<int> myvector{1, 2, 3, 2, 2, 2, 5, 4, 2};
Solution S;
cout<<S.majorityElement(myvector)<<endl;
system("pause");
return 0;
}
方法二:摩爾投票法(本題最佳解法)。其實就是諸侯亂戰,你作為東方大國,擁有超過總數 1/2 的兵力,且規定一個兵打一個兵必定同歸於盡,那麼即使全部諸侯打你一個,最後剩下的兵肯定也是你的兵,也就是你贏了。
所以我們的策略就是,先讓 res = nums[0],mole_vote = 1,然後往後迭代。但凡遇到下一個不等於 res,就讓 mole_vote --(相當於和一個敵人同歸於盡);如果下一個等於 res,則mole_vote ++。如果 mole_vote == 0 了,就讓 res 等於當前 numes[i]。
先放C++程式碼,思路簡單易懂。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int majorityElement(vector<int>& nums) {
int moleVote = 0, res = 0;
for(int i : nums){//for 迴圈
if(moleVote == 0){
res = i;
}
moleVote += res == i ? 1 : -1;//比較巧妙的投票法
}
return res;
}
};
int main()
{
vector<int> myvector{1, 2, 3, 2, 2, 2, 5, 4, 2};
Solution S;
cout<<S.majorityElement(myvector)<<endl;
system("pause");
return 0;
}
相關文章
- 力扣 - 劍指 Offer 39. 陣列中出現次數超過一半的數字力扣陣列
- [劍指offer題解][Java]陣列中出現次數超過一半的數字Java陣列
- 【劍指offer】數字在排序陣列中出現的次數排序陣列
- 《劍指offer》:[38]數字在排序陣列中出現的次數排序陣列
- 陣列中出現次數超過一半的數字陣列
- 劍指Offer-39-數字在排序陣列中出現的次數排序陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 劍指offer之列印超過陣列一半的數字陣列
- 48 陣列中出現次數超過一半的數字陣列
- JZ-028-陣列中出現次數超過一半的數字陣列
- 每日一練(20):陣列中出現次數超過一半的數字陣列
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 劍指offer 陣列中只出現一次的數字陣列
- 求出陣列中出現次數大於一半的數字陣列
- 《劍指offer》:[40]陣列中只出現一次的數字陣列
- 【劍指offer】陣列中只出現一次的數字(1)陣列
- 【劍指offer】陣列中只出現一次的數字(2)陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 查詢陣列中出現次數大於陣列長度一半的數字陣列
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 劍指Offer--陣列中重複的數字陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 《劍指offer》:[51]陣列中的重複數字陣列
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 【劍指offer】把陣列排成最小的數陣列
- 找到陣列中出現特定次數數字的問題陣列
- 陣列中出現兩次的數陣列
- 九度 1349 數字在排序陣列中出現的次數排序陣列
- JZ-037-數字在排序陣列中出現的次數排序陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 找出陣列中元素出現次數超過陣列長度一半的元素陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- [劍之offer] 03 陣列中重複的數字陣列
- 《劍指offer》:[41]陣列中和為S的兩個數陣列