一:工作中难免会有用到获取众数的情况,所以这里谈一个求众数的算法,请看下面的例子:
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;
}