多数元素
Leetcode169 简单
题目描述:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
思路一:抵消思想(摩尔投票法),哈哈哈,想到了动物世界里面李易峰帅气的推理。
回归正题,
- 定义变量
count=1,temp=arr[0]
,temp作为比较数之一,一直和数组中的其他元素进行比较。 - 从数组第二个元素开始比较,
如果与temp相同,则count+1,若不同则count-1
; 当count=0时,就选择刚刚与temp比较的数作为新的temp,并重置count=1。 - 重复上面的过程,直到遍历完整个数组。返回此时的temp.
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function (nums) {
let count = 1,
temp = nums[0];
for (let i = 1, len = nums.length; i < len; i++) {
if (count > 0) {
if (temp == nums[i]) {
count++
} else {
count--
}
} else {
temp = nums[i];
count = 1;
}
}
return temp;
};
思路二: 排序
var majorityElement = function (nums) {
nums.sort((a,b)=>a-b)
return nums[Math.floor(nums.length/2)]
};
**思路三:**通过map保存数组中每一个元素及其出现的次数,最后遍历map,输出map中value大于数组一半长度对应的key.
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function (nums) {
let map=new Map();
for(let i=0,len=nums.length;i<len;i++){
if(map.has(nums[i])){
map.set(nums[i],map.get(nums[i])+1)
}else{
map.set(nums[i],1)
}
}
for(let item of map.entries()){
if(item[1]>nums.length/2){
return item[0]
}
}