遍历 求水王数

92 阅读1分钟

题目

假设数组长度为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