剑指 Offer 39. 数组中出现次数超过一半的数字
解题思路
HashMap比较好理解,遍历一遍数组,取得众数
关键是投票法
-
思想就是一票抵一票,即使是最差的情况,每一个非众数的数都和众数去抵消,众数仍然有余
首先判断cnt是否为0
-
如果 cnt==0,那么就将新的数假设为众数 ans,并进行 cnt++ 如果 cnt!=0,那么就需要判断当前的数,是否和已经存在的ans相同,如果相同,那么cnt+1,如果不相同,那么 cnt-1
代码
class Solution {
public int majorityElementA(int[] nums) {
// HashMapm,时间复杂度为O(n),空间复杂度为O(n)
HashMap<Integer,Integer> map = new HashMap<>();
for(int i: nums){
int cnt = map.getOrDefault(i,0)+1;
map.put(i,cnt);
if(cnt > nums.length/2) return i;
}
return nums.length==0 ? 0 : nums[0];
}
public int majorityElement(int[] nums) {
// 使用投票法,一票抵一票,两个不相同的数相互抵消,最差的情况,每一个非众数都和众数抵消,但是此时众数仍然有余
int cnt=0, ans=0;
for(int num:nums){
if(cnt==0){
cnt++;
ans = num;
}else{
cnt += num==ans ? 1 : -1;
}
}
return nums.length==0 ? 0 : ans;
}
}
上一篇:
92天倒计时,蓝桥杯省赛备赛攻略来啦~
下一篇:
echarts 自定义鼠标悬停展示
