这题 用到摩尔投票法(时间复杂度O(n),空间复杂度O(1))
核心就是 对拼消耗。
因为 此题描述了,多数元素占比超过总元素的二分之一。
玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。
那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。
最后能剩下的必定是自己人。
public static int majorityElement(int[] nums) {
int n = nums.length;
int num = nums[0]; // 我先来做霸王
int cnt = 1; // 我就一个人
for (int i = 1; i < n; i++) {
if (cnt > 0) { // 战斗到最后一兵一卒
if (nums[i] == num) { // 战友来了
cnt++;
} else { // 与敌军1v1拼死一个战士
cnt--;
}
} else { // 全部牺牲,改朝换代
num = nums[i];
cnt = 1;
}
}
// 谁站(笑)到了最后
return num;
}
注:只适用于 数量大于总数的一半