• 一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数

      1. public int majorityElement(int[] nums){
      2. int count = 0;
      3. int num = nums[0];
      4. for(int i=1;i<nums.length;i++){
      5. if(nums[i] != num){
      6. count--;
      7. if(count < 0){
      8. count = 0;
      9. num = nums[i];
      10. }
      11. }else{
      12. count++;
      13. }
      14. }
      15. return num;
      16. }
    • 给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素

      • 答案至多两个

        1. class Solution {
        2. public List<Integer> majorityElement(int[] nums) {
        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) { //如果该元素为第一个元素,则计数加1
        9. vote1++;
        10. } else if (vote2 > 0 && num == element2) { //如果该元素为第二个元素,则计数加1
        11. vote2++;
        12. } else if (vote1 == 0) { // 选择第一个元素
        13. element1 = num;
        14. vote1++;
        15. } else if (vote2 == 0) { // 选择第二个元素
        16. element2 = num;
        17. vote2++;
        18. } else { //如果三个元素均不相同,则相互抵消1次
        19. vote1--;
        20. vote2--;
        21. }
        22. }
        23. int cnt1 = 0;
        24. int cnt2 = 0;
        25. for (int num : nums) {
        26. if (vote1 > 0 && num == element1) {
        27. cnt1++;
        28. }
        29. if (vote2 > 0 && num == element2) {
        30. cnt2++;
        31. }
        32. }
        33. // 检测元素出现的次数是否满足要求
        34. List<Integer> ans = new ArrayList<>();
        35. if (vote1 > 0 && cnt1 > nums.length / 3) {
        36. ans.add(element1);
        37. }
        38. if (vote2 > 0 && cnt2 > nums.length / 3) {
        39. ans.add(element2);
        40. }
        41. return ans;
        42. }
        43. }