题目链接

题目描述

image.png

思路

使用 map 遍历,然后再遍历 map,取出 count > n / 3 的即可

  1. public List<Integer> majorityElement(int[] nums) {
  2. Map<Integer, Integer> map = new HashMap<>(16);
  3. List<Integer> res = new ArrayList<>();
  4. for (int num : nums) {
  5. Integer count = map.getOrDefault(num, 0);
  6. map.put(num, count + 1);
  7. }
  8. for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
  9. if (entry.getValue() > (nums.length / 3)) {
  10. res.add(entry.getKey());
  11. }
  12. }
  13. return res;
  14. }

image.png
https://leetcode-cn.com/problems/majority-element-ii/solution/qiu-zhong-shu-ii-by-leetcode-solution-y1rn/

  • 额,这个不好描述,建议使用代码调试,非常清晰

    1. public List<Integer> majorityElement(int[] nums) {
    2. // 先选择备选人,超过n/3的最多有两个
    3. int element1 = 0;
    4. int element2 = 0;
    5. int vote1 = 0;
    6. int vote2 = 0;
    7. for (int num : nums) {
    8. if (vote1 > 0 && num == element1) {
    9. // 如果该元素为第一个元素,则计数加1
    10. // elem1 已经被选过,再次遇见,票数加一
    11. vote1++;
    12. } else if (vote2 > 0 && num == element2) {
    13. // 如果该元素为第二个元素,则计数加1
    14. // elem2 已经被选过,再次遇见,票数加一
    15. vote2++;
    16. } else if (vote1 == 0) {
    17. // elem1 还没有被选,选择当前数作为elem1
    18. // 选择第一个元素
    19. element1 = num;
    20. vote1++;
    21. } else if (vote2 == 0) {
    22. // 选择第二个元素
    23. // elem2 还没有被选,选择当前数作为elem1
    24. element2 = num;
    25. vote2++;
    26. } else {
    27. // 遇见一个既不属于 elem1,也不属于 elem2 的数,票数都减一
    28. // 如果三个元素均不相同,则相互抵消1次
    29. vote1--;
    30. vote2--;
    31. }
    32. }
    33. int cnt1 = 0;
    34. int cnt2 = 0;
    35. for (int num : nums) {
    36. if (vote1 > 0 && num == element1) {
    37. cnt1++;
    38. }
    39. if (vote2 > 0 && num == element2) {
    40. cnt2++;
    41. }
    42. }
    43. // 检测元素出现的次数是否满足要求
    44. List<Integer> ans = new ArrayList<>();
    45. if (vote1 > 0 && cnt1 > nums.length / 3) {
    46. ans.add(element1);
    47. }
    48. if (vote2 > 0 && cnt2 > nums.length / 3) {
    49. ans.add(element2);
    50. }
    51. return ans;
    52. }