题目描述
思路
使用 map
public List<Integer> majorityElement(int[] nums) {Map<Integer, Integer> map = new HashMap<>(16);List<Integer> res = new ArrayList<>();for (int num : nums) {Integer count = map.getOrDefault(num, 0);map.put(num, count + 1);}for (Map.Entry<Integer, Integer> entry : map.entrySet()) {if (entry.getValue() > (nums.length / 3)) {res.add(entry.getKey());}}return res;}
额,这个不好描述,建议使用代码调试,非常清晰
public List<Integer> majorityElement(int[] nums) {// 先选择备选人,超过n/3的最多有两个int element1 = 0;int element2 = 0;int vote1 = 0;int vote2 = 0;for (int num : nums) {if (vote1 > 0 && num == element1) {// 如果该元素为第一个元素,则计数加1// elem1 已经被选过,再次遇见,票数加一vote1++;} else if (vote2 > 0 && num == element2) {// 如果该元素为第二个元素,则计数加1// elem2 已经被选过,再次遇见,票数加一vote2++;} else if (vote1 == 0) {// elem1 还没有被选,选择当前数作为elem1// 选择第一个元素element1 = num;vote1++;} else if (vote2 == 0) {// 选择第二个元素// elem2 还没有被选,选择当前数作为elem1element2 = num;vote2++;} else {// 遇见一个既不属于 elem1,也不属于 elem2 的数,票数都减一// 如果三个元素均不相同,则相互抵消1次vote1--;vote2--;}}int cnt1 = 0;int cnt2 = 0;for (int num : nums) {if (vote1 > 0 && num == element1) {cnt1++;}if (vote2 > 0 && num == element2) {cnt2++;}}// 检测元素出现的次数是否满足要求List<Integer> ans = new ArrayList<>();if (vote1 > 0 && cnt1 > nums.length / 3) {ans.add(element1);}if (vote2 > 0 && cnt2 > nums.length / 3) {ans.add(element2);}return ans;}

