一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数
public int majorityElement(int[] nums){int count = 0;int num = nums[0];for(int i=1;i<nums.length;i++){if(nums[i] != num){count--;if(count < 0){count = 0;num = nums[i];}}else{count++;}}return num;}
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素
答案至多两个
class Solution {public List<Integer> majorityElement(int[] nums) {int element1 = 0;int element2 = 0;int vote1 = 0;int vote2 = 0;for (int num : nums) {if (vote1 > 0 && num == element1) { //如果该元素为第一个元素,则计数加1vote1++;} else if (vote2 > 0 && num == element2) { //如果该元素为第二个元素,则计数加1vote2++;} else if (vote1 == 0) { // 选择第一个元素element1 = num;vote1++;} else if (vote2 == 0) { // 选择第二个元素element2 = num;vote2++;} else { //如果三个元素均不相同,则相互抵消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;}}
