给定一个大小为 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 * 104
-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。
class Solution {
public List<Integer> majorityElement(int[] nums) {
int a = 0, b = 0; //最多只有k-1个元素满足
int c1 = 0, c2 = 0;
for (int num : nums) {
//一定要注意顺序
if (c1 != 0 && num == a) c1++;
else if (c2 != 0 && num == b) c2++;
else if (c1 == 0 && ++c1 > 0) a = num;
else if (c2 == 0 && ++c2 > 0) b = num;
else {
c1--; c2--;
}
}
//检查a,b是否都满足
c1 = 0; c2 = 0;
for (int num : nums)
if (num == a) c1++;
else if (num == b) c2++;
List<Integer> res = new ArrayList<>();
if (c1 > nums.length / 3) res.add(a);
//[0,0,0] a = b = 0;
if (a != b && c2 > nums.length / 3) res.add(b);
return res;
}
}