题目
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3]
输出: [3]
示例 2:输入: [1,1,1,3,3,2,2,2]
输出: [1,2]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element-ii
解题思路
使用摩尔投票法,得出超过⌊ n/3 ⌋ 次的元素,因为只可能有0-2个数,所以使用2个变量来保存即可。
代码如下
class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> res = new ArrayList<>();
int numA = 0, numB = 0, countA = 0, countB = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == numA) {
countA++;
} else if (numB == nums[i]) {
countB++;
} else if (countA == 0) {
numA = nums[i];
countA++;
} else if (countB == 0) {
numB = nums[i];
countB++;
} else {
countA--;
countB--;
}
}
countA = 0;
countB = 0;
for (int num: nums){
if (numA == num) {
countA++;
}
else if (numB == num) {
countB++;
}
}
if (countA > nums.length/3){
res.add(numA);
}
if (countB > nums.length/3){
res.add(numB);
}
return res;
}
}