给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋
次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3] 输出: [3]
示例 2:
输入: [1,1,1,3,3,2,2,2] 输出: [1,2]
方法一:
思路:1、将值和出现的次数存到map中,最后遍历map
public List<Integer> majorityElement(int[] nums) { if (nums==null ){ return null; } int k = nums.length/3; Map<Integer,Integer> map = new HashMap<>(); List<Integer> list = new ArrayList(); for (int i=0;i<nums.length;i++) { if (map.containsKey(nums[i])) { int count = map.get(nums[i])+1; map.put(nums[i],count); } else { map.put(nums[i],1); } } map.entrySet().forEach(e->{ if (e.getValue()>k) { list.add(e.getKey()); } }); return list; }
方法二:
思路:摩尔投票法 https://mabusyao.iteye.com/blog/2223195
代码:
public List<Integer> majorityElement3(int[] nums) { int value1 = Integer.MIN_VALUE + 1, value2 = Integer.MIN_VALUE + 1, count1 = 0, count2 = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] == value1 && count1 >= 0) { count1++; } else if (nums[i] == value2 && count2 >= 0) { count2++; } else if (count1 == 0) { value1 = nums[i]; count1 = 1; } else if (count2 == 0) { value2 = nums[i]; count2 = 1; } else { count1--; count2--; } } count1 = 0; count2 = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] == value1) { count1++; } if (nums[i] == value2) { count2++; } } List<Integer> result = new ArrayList<Integer>(); if (count1 > (nums.length / 3)) { result.add(value1); } if (count2 > (nums.length / 3)) { result.add(value2); } return result; }