- 一、题目
- 二、分析及代码
- 1. 摩尔投票法
- (1)思路
- (2)代码
- (3)结果
- 三、其他
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
示例 1:
输入:[3,2,3] 输出:[3]
示例 2:
输入:nums = [1] 输出:[1]
示例 3:
输入:[1,1,1,3,3,2,2,2] 输出:[1,2]
提示:
- 1 <= nums.length <= 5 * 10^4
- -10^9 <= nums[i] <= 10^9
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
根据题意,出现超过 ⌊ n/3 ⌋ 次的元素最多只有 2 个,因此可结合摩尔投票法对出现过的元素进行对拼消耗,记录每次留下的 2 个元素及剩余次数。
在对拼中留下是出现超过 ⌊ n/3 ⌋ 次的必要不充分条件,因此需二次遍历,确认 2 个元素的出现次数是否满足要求。
(2)代码class Solution {
public:
vector majorityElement(vector& nums) {
int num1 = 0, num2 = 0, cnt1 = 0, cnt2 = 0;//对拼后留下的元素1、2,及元素1、2的剩余次数
for (int num : nums) {//遍历数组
if (num == num1 && cnt1 > 0) {//新数字为元素1,对应剩余次数增加
cnt1++;
} else if ( num == num2 && cnt2 > 0) {//新数字为元素2,对应剩余次数增加
cnt2++;
} else if (cnt1 == 0) {//元素1为空,将当前数字标记为元素1
num1 = num;
cnt1++;
} else if (cnt2 == 0) {//元素2为空,将当前数字标记为元素2
num2 = num;
cnt2++;
} else {//对拼消耗,所有元素剩余次数-1
cnt1--;
cnt2--;
}
}
vector ans;//输出数组
cnt1 = 0;//重置元素1次数
cnt2 = 0;//重置元素2次数
for (int num : nums) {//统计元素1、2的出现次数
if (num == num1) {
cnt1++;
} else if (num == num2) {
cnt2++;
}
}
if (cnt1 > nums.size() / 3) {//元素1符合要求,则加入答案
ans.push_back(num1);
}
if (cnt2 > nums.size() / 3) {//元素2符合要求,则加入答案
ans.push_back(num2);
}
return ans;
}
};
(3)结果
执行用时 :16 ms,在所有 C++ 提交中击败了 33.82% 的用户;
内存消耗 :15.5 MB,在所有 C++ 提交中击败了 31.49% 的用户。
暂无。


![LeetCode——229. 求众数 II(Majority Element II)[中等]——分析及代码(C++) LeetCode——229. 求众数 II(Majority Element II)[中等]——分析及代码(C++)](http://www.mshxw.com/aiimages/31/346930.png)
