题目连接:
https://leetcode.cn/problems/majority-element/solutions/2362000/169-duo-shu-yuan-su-mo-er-tou-piao-qing-ledrh/?envType=study-plan-v2&envId=top-interview-150
题目描述:
思路一:
使用哈希表
unordered_map
记录每个元素出现的次数,当满足条件时返回即可
代码:
时间复杂度O(n)
空间复杂度O(n)
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> map;
int n = nums.size();
for(int i=0; i<n; i++){
map[nums[i]]++;
if(map[nums[i]] >int(n/2)){
return nums[i];
}
}
return 0;
}
};
思考:有什么方法可以将空间复杂度将到O(1)呢?
摩尔投票算法:
- 核心思想是抵消原则,在一个数组中如果某一个元素超过了一半,那么这个元素与其他元素一一配对,最后至少剩下一个该元素。
算法详解: https://leetcode.cn/problems/majority-element/solutions/2362000/169-duo-shu-yuan-su-mo-er-tou-piao-qing-ledrh/
时间复杂度O(N)
空间复杂度O(1)
代码实现:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int x = 0, votes = 0;
for (int num : nums){
if (votes == 0) x = num;
votes += num == x ? 1 : -1;
}
return x;
}
};