1、題目描述
給定一個大小爲 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設數組是非空的,並且給定的數組總是存在多數元素。
2、示例
輸入: [2,2,1,1,1,2,2]
輸出: 2
3、題解
解法一:
基本思想:Boyer-Moore投票法,時間複雜度O(n)空間複雜度O(1)。從第一個數開始count=1,遇到相同的就加1,遇到不同的就減1,減到0就重新換個數開始計數,最終找到超過半數的那個。
這題一開始想到就是哈希表和排序法,但都無法做到時間複雜度O(n)空間複雜度O(1),但這種題一定有一種最佳算法,抓住問題的最大特徵,要找的那個數在nums中超過半數。
類似玩一個諸侯爭霸的遊戲,數組順序就是各諸侯派兵幹仗的順序,其中有一個諸侯人口超過總人口一半以上,並且每個人口出去幹仗都能一對一同歸於盡。找出最後活下來的諸侯國。最差所有人都聯合起來對付最大人口諸侯國,或者其他國家也會相互攻擊,最後能剩下的必定是人口最多的諸侯國。
解法二:
基本思想:哈希表,時間複雜度O(n)空間複雜度O(n)
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
int majorityElement(vector<int>& nums) {
//基本思想:Boyer-Moore投票法,時間複雜度O(n)空間複雜度O(1)
//這題一開始想到就是哈希表和排序法,但都無法做到時間複雜度O(n)空間複雜度O(1),但這種題一定有一種最佳算法
//抓住問題的最大特徵,要找的那個數在nums中超過半數
//從第一個數開始count=1,遇到相同的就加1,遇到不同的就減1,減到0就重新換個數開始計數,最終找到超過半數的那個
int candidate = nums[0];
int count = 1;
for (int i = 1; i < nums.size(); i++)
{
if (nums[i] == candidate)
count++;
else
{
count--;
if (count == 0)
{
candidate = nums[i];
count = 1;
}
}
}
return candidate;
}
};
class Solution1 {
public:
int majorityElement(vector<int>& nums) {
//基本思想:哈希表,時間複雜度O(n)空間複雜度O(n)
unordered_map<int, int> HashMap;
int res, cnt = 0;
for (auto v : nums)
{
++HashMap[v];
if (HashMap[v] > cnt)
{
res = v;
cnt = HashMap[v];
}
}
return res;
}
};
int main()
{
Solution solute;
vector<int> nums = { 2,2,1,1,1,2,2 };
cout << solute.majorityElement(nums) << endl;
return 0;
}