题目描述:
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3]
输出: [3]
示例 2:
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]
看求n/2 的摩尔投票法进行的解法
类似的我们可以设置两个变量,count1和count2进行计数,num1和num2进行数字记录;
因为不可能次数多余n/3的个数不可能超过两个,代码
class Solution {
public List<Integer> majorityElement(int[] nums) {
// 摩尔投票法,大于n/3那么最多只有两个,因此定义两个计数的变量
List<Integer> list = new ArrayList<>();
int count1 = 0;
int count2 = 0;
int num1 = nums[0];
int num2 = nums[0];
for (Integer integer : nums) {
if(integer == num1){
count1 ++;
}else if (integer == num2) {
count2 ++;
}else if (count1 == 0) {
count1 = 1;
num1 = integer;
}else if (count2 == 0) {
count2 = 1;
num2 = integer;
}else {
count1 --;
count2 --;
}
}
count1 = 0;
count2 = 0;
for (Integer integer : nums) {
if(integer == num1){
count1 ++;
}
if(integer == num2){
count2 ++;
}
}
int len = nums.length / 3;
if(count1 > len){
list.add(num1);
}
if(count2 > len && num1 != num2){
list.add(num2);
}
return list;
}
}