/**
* 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
* 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
*
* 示例 1:
* 输入:[3,2,3]
* 输出:3
*
* 示例 2:
* 输入:[2,2,1,1,1,2,2]
* 输出:2
*
* 进阶:
* 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
*
*
* 解题思路一:
* 1.遍历计数,当当前所记的数>大于 ⌊ n/2 ⌋时,返回对应元素;
*
* 进阶解题思路:
* 1.投票算法:总的思想就是 所有目标元素一定比非目标数的数量多,如果我们把目标数记为1,非目标数记为-1
* 那么最后累加的结果一定>0
* candidate 当前候选人
* count 当前候选人票数
* 每当count==0 时,更新候选人,重新开始计数
* nums[i] == candidate count+1
* nums[i] !== candidate count-1
*
* 如: [ 2, 2, 1, 4, 8, 1, 7, 8, 1, 9, 2, 2]
* candidate 2 2 2 2 8 8 7 7 1 1 2 2
* count 1 2 1 0 1 0 1 0 1 0 1 2
*/
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement1 = function(nums) {
var n = nums.length;
if(n==1){
return nums[0];
}
var obj={};
for(var i=0;i<n;i++){
if(nums[i] in obj){
obj[nums[i]]++;
if(obj[nums[i]]>(n/2)){
return nums[i];
}
}else{
obj[nums[i]]=1;
}
}
return -1;
};
var majorityElement = function(nums) {
var count=0,candidate=null,n=nums.length;
for(var i=0;i<n;i++){
if(count==0){
candidate = nums[i];
}
count += nums[i]==candidate?1:-1;
}
return candidate;
};
var nums = [2,2,1,1,1,2,2];
console.log(majorityElement(nums));
leetcode算法刷题记录之多数元素
最新推荐文章于 2022-01-24 14:21:47 发布