题解 |【清晰图解】 #数组中出现次数超过一半的数字#摩尔投票
默认你已经理解题意了哈
思路如下
想象一下,假设一个数组是一个投票箱,数组元素是一张已经写了选举人编号的一张选票
题目上说要求我们找出哪个数字,能够超过了数组的一半呢?
是否就可以想象成,哪个人成为了最终选举的胜利者!
那么,我们接下来要做的事情,就是找到票数最多的那个人的编号就可以了
是不是感觉像这么回事儿,很有精神!
我们可以试着模拟一下,如下所示:
假如我们有个职位,需要从 A,B 两位候选人中选出
先抽出一张票,投的是 A,我们在黑板上写着当前胜利者:A,票数:1
再抽出一张票,投的是 A,我们在黑板上写着当前胜利者:A,票数:2
再抽出一张票,投的是 B,用一张 B 抵消一张 A 的选票,我们在黑板上写着当前胜利者:A,票数:1
再抽出一张票,投的是 B,用一张 B 抵消一张 A 的选票,我们在黑板上写着当前胜利者:无,票数:0
再抽出一张票,投的是 A,我们在黑板上写着当前胜利者:A,票数:1
抽取完毕,恭喜 A 获胜,赢得该职位
演示过程
经过上面例子的分析,可以得出 3 点:
- 不同候选人的选票之间,是可以一一抵消
- 假如当前胜利者存在多张选票时,不同的候选人的票,只能抵消一张当前胜利者的
- 假如当前双方的选票都被抵消为零,那么下一次抽出的候选人,将作为暂时的胜利者并领先
写代码
//JS的代码哦
var majorityElement = function(nums) {
let ans = 0, count = 0;
for(let i = 0; i < nums.length; i++){
if(!count) {
ans = nums[i];
count++;
}else count += nums[i] === ans ? 1 : -1;
}
return ans;
};
骚年,作图不容易,留下个赞或评论再走吧 谢啦~,祝你Offer多多哦 💐