布尔投票计算众数

393 阅读2分钟

一:工作中难免会有用到获取众数的情况,所以这里谈一个求众数的算法,请看下面的例子:

1. 多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [3,2,3] 输出: 3 示例 2:

输入: [2,2,1,1,1,2,2] 输出: 2

var majorityElement = function (nums) {
   let candidate = 0;
   let count = 0;
   for (let i = 0; i < nums.length; i++) {
       if(count === 0)   //如果候选人数量为0就将当前的值赋给候选人
       {
          candidate = nums[i];
       }

       if(nums[i] === candidate) // 如果候选人正好和当前值相等就给他上一票
       {
          count++;
       }

       else if(nums[i] !== candidate) //如果候选人和当前值不等就给他下一票
       {
           count--;
       }
       
   }
   return candidate;

}

求众数II

给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例 1:

输入: [3,2,3] 输出: [3] 示例 2:

输入: [1,1,1,3,3,2,2,2] 输出: [1,2]

var majorityElement = function (nums) {
    var cnt1 = 0;
    var cnt2 = 0;
    var candidate1 = 0;
    var candidate2 = 0;
    var ans = [];

    for(let i = 0 ; i< nums.length ;i++)
    {
        if(nums[i] === candidate1) //判断候选人1和当前的数是否一样,一样的话就候选人1的数++。
        cnt1++;
        else if(nums[i] === candidate2) //判断候选人2和当前的数是否一样,一样的话候选人2的数++。
        cnt2++;
        else if(cnt1 === 0)//如果当前的数既不是候选人1也不是候选人2,若数量为0,就将当前值替换为候选人
        {
            candidate1 = nums[i];
            cnt1++;
        }
        
        else if(cnt2 === 0)//如果当前候选人2的票数为0,就替换当前值
        {
            candidate2 = nums[i];
            cnt2++;
        }
     
        else//如果当前既不是候选人1,也不是候选人2,那么就将各个候选人票数--
        {
            cnt1--;
            cnt2--;
        }
    }
    cnt2 = 0;
    cnt1 = 0;
    for(let j = 0 ; j < nums.length ;j++)
    {
        if(nums[j] === candidate1)//统计候选人1票数
        {
            cnt1++;
        }

        else if(nums[j] === candidate2)//统计候选人2票数
        {
            cnt2++;
        }
    }

    if(cnt1 > Math.floor(nums.length / 3))
    {
        ans.push(candidate1);
    }

    if(cnt2 > Math.floor(nums.length / 3))
    {
        ans.push(candidate2);
    }

    return ans;

}