题目
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
题解一 哈希表计数
var majorityElement = function(nums) {
const len = nums.length,
half = len / 2,
m = new Map();
for (let i = 0; i < nums.length; i++) {
const item = nums[i];
m.set(item, (m.get(item) || 0) + 1);
if (m.get(item) > half) return item;
}
};
笔记:
-
1. var m = new Map(); *// 空Map* 2. m.set('Adam', 67); *// 添加新的key-value* 3. m.set('Bob', 59); 4. m.has('Adam'); *// 是否存在key 'Adam': true* 5. m.get('Adam'); *// 67* 6. m.delete('Adam'); *// 删除key 'Adam'* 7. m.get('Adam'); *// undefined*
-
Set 对象的方法和属性 new Set() 创建新的 Set 对象。 add() 向 Set 添加新元素。 clear() 从 Set 中删除所有元素。 delete() 删除由其值指定的元素。 entries() 返回 Set 对象中值的数组。 has() 如果值存在则返回 true。 forEach() 为每个元素调用回调。 keys() 返回 Set 对象中值的数组。 values() 与 keys() 相同。 size 返回元素计数。
题解二 排序法
var majorityElement = function (nums) {
nums.sort((a, b) => a - b);//不要加大括号
return nums[Math.floor(nums.length / 2)];
};
笔记:
-
数字排序(数字和升序):
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b}); -
math.floor 向下取整
题解三 摩尔计数法
var majorityElement = function (nums) {
let count = 0;
let candidate;
for (let a of nums) {
if (count == 0) candidate = a;
count += candidate == a ? 1 : -1;
}
return candidate;
};
笔记:
-
题目求多数元素,有点类似古代两军对战,
两军领导说我们一对一火拼,人多的哪怕多一个人就胜利了
A军B军火力值相同(人数相同)的情况下,我们假设让A军做胜利的候选者
来了一个兵,问这个兵你是站队A军还是不站队A军,如果站队A军的话,A军火力值加1
如果不站队A军,那A军火力值减1
最后人数最多的军队胜出 -
摩尔投票法,遇到相同的数,就投一票,遇到不同的数,就减一票,最后还存在票的数就是众数