题目
假设数组长度为N,如果某一种数的出现次数大于 N/2,那么说这个数叫做水王数,给定一个数组arr,如果有水王数,打印水王数是什么,如果没有水王数,打印水王数不存在,要求时间复杂度O(N),不能申请表,只能申请有限几个变量
- 因为O(N),表示只能一层遍历解决
- 通过累计消耗的思路,定义cond表示候选,hp表示候选次数,因为水王数的长度大于数组的一半,所以如果用水王的次数减去其他元素的次数一定大于0,所以遍历思路为每次遇到相同的数hp+1,不同hp-1,当hp为0时,更换cond为下一个遍历的数,hp置为1,如果有水王数,那么最后hp>0,但如果最后hp>0,那么不一定存在水王数,比如[1,2,3,4,5,5],最后cond为5,hp为2,但5不是水王数,所以还要遍历数组,获取等于cond的次数是否大于数组的一半
- 记词频的省空间的用法
function wang(arr) {
let cand = 0;
let hp = 0;
arr.forEach((num) => {
if (hp == 0) {
cand = num;
hp = 1;
} else if (num == cand) {
hp++;
} else {
hp--;
}
if (hp == 0) {
console.log("no");
}
});
hp = 0;
arr.forEach((num) => {
if (num == cand) {
hp++;
}
});
if (hp > arr.length / 2) {
console.log("水王数是" + cand);
} else {
console.log("no");
}
}
- 多线程照样可以这么用:比如A段剩5,hp:3,B剩7,h:4,那么水王为7,hp为1