标签:说明 logs 示例 时间复杂度 不能 problem 题目 描述 for
给定一个大小为 n 的数组,找出其中所有出现超过 ? n/3 ? 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例:
输入: [3,2,3]
输出: [3]
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]
题目链接: https://leetcode-cn.com/problems/majority-element-ii/
做这题之前要先做一下多数元素。
要求算法的时间复杂度为 O(n),空间复杂度为 O(1),所以排序和哈希表的算法都不能用了。这题使用和多数元素类似的投票法。
超过n/3的元素一定不超过2个。我们将这两个数字记为candi1和candi2,对应的票数分别为cnt1和cnt2。算法如下:
代码如下:
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
if(nums.empty()) return {};
int candi1=0, candi2=0;
int cnt1=0, cnt2 = 0;
for(int i=0; i<nums.size(); i++){
if(nums[i]==candi1){
cnt1++;
continue;
}
if(nums[i]==candi2){
cnt2++;
continue;
}
if(cnt1==0){
candi1 = nums[i];
cnt1++;
continue;
}
if(cnt2==0){
candi2 = nums[i];
cnt2++;
continue;
}
cnt1--;
cnt2--;
}
cnt1 = 0;
cnt2 = 0;
for(int i=0; i<nums.size(); i++){
if(nums[i]==candi1) cnt1++;
else if(nums[i]==candi2) cnt2++;
}
vector<int> ans;
if(cnt1>nums.size()/3) ans.push_back(candi1);
if(cnt2>nums.size()/3) ans.push_back(candi2);
return ans;
}
};
标签:说明 logs 示例 时间复杂度 不能 problem 题目 描述 for
原文地址:https://www.cnblogs.com/flix/p/12812160.html