求众数
这是求众数的变体,需要利用到三个不同的变量进行抵消。

最后需要注意的点是,如果没有这样的众数,也会选到两个元素,我们需要再次遍历,然后查看这两个元素是否大于 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;
}
}
可以看出投票法比哈希快很多。

这篇博客讨论了两种在数组中寻找众数的方法:投票法和哈希计数。代码示例显示,投票法在处理众数问题时表现出更高的效率,特别是在避免散列、扩容和冲突带来的额外时间成本方面。文章强调了在特定情况下,投票法可以作为更优的选择。
1086

被折叠的 条评论
为什么被折叠?



