求众数
这是求众数的变体,需要利用到三个不同的变量进行抵消。
最后需要注意的点是,如果没有这样的众数,也会选到两个元素,我们需要再次遍历,然后查看这两个元素是否大于 n/3
class Solution {
public List<Integer> majorityElement(int[] nums) {
int vote1=0;
int vote2=0;
int element1=0;
int element2=0;
for(int num:nums){
if(vote1>0&&num==element1){
vote1++;
}
else if(vote2>0&&num==element2){
vote2++;
}
else if(vote1==0){
element1=num;
vote1++;
}
else if(vote2==0){
element2=num;
vote2++;
}
else{
vote1--;
vote2--;
}
}
int cnt1=0;
int cnt2=0;
for(int num:nums){
if(num==element1){
cnt1++;
}
else if(num==element2){
cnt2++;
}
}
List<Integer> ans = new ArrayList<>();
if(cnt1>nums.length/3){
ans.add(element1);
}
if(cnt2>nums.length/3){
ans.add(element2);
}
return ans;
}
}
当然也可以用哈希表,但是散列,扩容,冲突 所需要的时间相比于上面,还是多出很多的,时间复杂度也不太行。
class Solution {
public List<Integer> majorityElement(int[] nums) {
//试一下用哈希计数。
//遍历,统计是否出现过
Map<Integer,Integer> visit = new HashMap<>();
for(int num:nums){
if(visit.containsKey(num)){
visit.put(num,visit.get(num)+1);
}
else{
visit.put(num,1);
}
}
List<Integer> ans = new ArrayList<>();
for(int key:visit.keySet()){
if(visit.get(key)>nums.length/3){
ans.add(key);
}
}
return ans;
}
}
可以看出投票法比哈希快很多。