Leetcode 229. 求众数 II
题目
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
测试样例
示例 1:
输入: [3,2,3]
输出: [3]
示例 2:
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]
题解
哈希表记录数字出现次数,大于n/3则加到答案数组中,但这种做法的空间复杂度是n,不是1。
对于这种题采用投票法,首先,我们可以肯定如果这个数出现次数超过n/3,则说明这样的数最多存在2个。我们不妨用两个两遍,分别统计两个数的相对出现次数。即,出现的那个数+1;这两个数都没有出现,则都-1。显然,我们可以利用这个方法求出来前两个出现次数最多的数。
然后我们再遍历数组,统计这两个数的出现次数,大于n/3,则加入答案中。详细过程见代码
代码
vector<int> majorityElement(vector<int>& nums) {
vector<int> ans;
int num1=-1,num2=-1,cnt1=0,cnt2=0;
int n = nums.size();
for(int i=0; i<n; i++){ //获取统计次数排名前2的数字
if(num1 == nums[i]){
cnt1++;
}else if(num2 == nums[i]){
cnt2++;
}else if(cnt1 == 0){
num1 = nums[i];
cnt1++;
}else if(cnt2 == 0){
num2 = nums[i];
cnt2++;
}else{
cnt1--;
cnt2--;
}
}
cnt1=0;
cnt2=0;
for(int i=0; i<n; i++){ //统计这两个数字的出现次数
if(nums[i] == num1) cnt1++;
else if(nums[i] == num2) cnt2++;
}
if(cnt1 > n/3) ans.push_back(num1);
if(cnt2 > n/3) ans.push_back(num2);
return ans;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。