给定一个大小为 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)的算法解决此问题。


    1. class Solution {
    2. public List<Integer> majorityElement(int[] nums) {
    3. int a = 0, b = 0; //最多只有k-1个元素满足
    4. int c1 = 0, c2 = 0;
    5. for (int num : nums) {
    6. //一定要注意顺序
    7. if (c1 != 0 && num == a) c1++;
    8. else if (c2 != 0 && num == b) c2++;
    9. else if (c1 == 0 && ++c1 > 0) a = num;
    10. else if (c2 == 0 && ++c2 > 0) b = num;
    11. else {
    12. c1--; c2--;
    13. }
    14. }
    15. //检查a,b是否都满足
    16. c1 = 0; c2 = 0;
    17. for (int num : nums)
    18. if (num == a) c1++;
    19. else if (num == b) c2++;
    20. List<Integer> res = new ArrayList<>();
    21. if (c1 > nums.length / 3) res.add(a);
    22. //[0,0,0] a = b = 0;
    23. if (a != b && c2 > nums.length / 3) res.add(b);
    24. return res;
    25. }
    26. }