
核心思想--抵消原则: 在一个数组中,如果某个元素的出现次数超过了数组长度的一半,那么这个元素与其他所有元素一一配对,最后仍然会剩下至少一个该元素。 通过“投票”和“抵消”的过程,可以逐步消除不同的元素,最终留下的候选人就是可能的主要元素。
我用「擂台赛」打比方:
擂主登场:nums[0] 成为初始擂主,生命值为 1。 挑战者出现:遍历后续元素,作为挑战者。 比武:如果挑战者与擂主属于同一门派(值相同),那么擂主生命值加 1,否则擂主生命值减 1。 擂主更迭:如果比武后,擂主生命值降为 0(同归于尽),那么下一个挑战者成为新的擂主,生命值为 1。 最后在擂台上的那人,便是武林盟主(严格众数)。
js
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function (nums) {
let ans = 0,
hp = 0
for (const x of nums) {
if (hp === 0) {
// x 是初始擂主,生命值为 1
ans = x
hp = 1
} else {
// 比武,同门加血,否则扣血
hp += x === ans ? 1 : -1
}
}
return ans
}