问题:
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.
思路一:与前述的majority element类似,采用直接遍历计算元素出现的次数,如果超过总长度的
13
,则就是目标值。
思路二:同前述的查找Majority element类似,舍弃掉三个不同的值是不影响原数组中的Majority element;在这里最多存在两个Majority element
class Solution {
public List<Integer> majorityElement(int[] nums) {
// if(nums.length<1)return null;
int max1=Integer.MAX_VALUE;//存储出现次数最多的元素
int max2 =Integer.MIN_VALUE;//存储出现次数第二多的元素
int count1 = 0;
int count2 = 0;
for(int i=0;i<nums.length;i++){//遍历数组
if(nums[i]==max1){
count1++;
}else if(nums[i]==max2){
count2++;
}else if(count1 ==0){
max1= nums[i];
count1 = 1;
}else if(count2 == 0){
max2 =nums[i];
count2 =1;
}else{//舍弃三个不同值
count1--;
count2--;
}
}
List<Integer> res = new ArrayList<>();
count2 = count1 =0;
//计算元素出现的次数
for(int i = 0;i<nums.length;i++){
if(nums[i]==max1){
count1++;
}
if(nums[i]==max2){
count2++;
}
}
//判断majority element
if(count1>nums.length/3){
res.add(max1);
}
if(count2>nums.length/3){
res.add(max2);
}
return res;
}
}