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.
解法:参考编程之美129页,寻找发帖水王
代码如下:
public class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> res=new ArrayList<>();
if(nums==null ||nums.length==0) return res;
int len=nums.length;
if(len==1){
res.add(nums[0]);
return res;
}
int m1=nums[0];
int m2=0;
int c1=1;
int c2=0;
for(int i=1;i<len;i++){
int x=nums[i];
if(x==m1) c1++;
else if(x==m2) c2++;
else if(c1==0){
m1=x;
c1=1;
}else if(c2==0){
m2=x;
c2=1;
}else{
c1--;c2--;
}
}
c1=0;c2=0;
for(int i=0;i<len;i++){
if(m1==nums[i]) c1++;
else if(m2==nums[i]) c2++;
}
if(c1>len/3) res.add(m1);
if(c2>len/3) res.add(m2);
return res;
}
}
运行结果:
(medium)LeetCode 229.Majority Element II
原文:http://www.cnblogs.com/mlz-2019/p/4709413.html