摩尔投票法——解决找到数组中的出现次数大于一半的数

相关概念

  • 投票和:由于数组中所要寻找的众数大于数组的一般长度,所以如果记跟众数x相等的数票数为+1,不等的为-1,那么最后的总和票数一定是大于0的;
  • 票数正负抵消:如果出现了前i个数的投票和为0,那么数组中剩下的部分的投票和一定会大于0;

算法构建

  • 首先设置数组中第一个数为众数x,那么发生正负抵消时:
    * 如果x为真正的众数,那么抵消的这部分中众数与非众数五五开,则剩下的部分一定是存在大于0的投票和
    * 如果x不为真正的众数,那么抵消的这部分中众数小于或等于一半,那么剩下的部分也一定是存在大于0的投票和
  • 可以可用正负抵消的特性,逐步压缩范围,直到遍历完数组找到令最终投票和大于0的那个数,返回即可

代码

public int majorityElement(int[] nums) {
  int val = nums[0];
  int all = 1;
  for(int i = 1;i<nums.length;i++){
      if(all==0){
          val = nums[i];
          all = 1;
          continue;
      }
      if(nums[i]!=val)all -= 1;
      if(nums[i]==val)all += 1;
  }
  return val;
}
posted @ 2020-08-30 12:06  珂珂哒  阅读(175)  评论(0)    收藏  举报