169. 多数元素
题目
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例
- 示例 1:
输入:nums = [3,2,3]
输出:3
- 示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
分析
-
本题重点在于多数元素的个数是大于数组的一半,也就是说比其他元素加起来都多
- 可以理解成, 每次从数组中删除两个不同的元素, 最后剩下的元素就是多数元素
-
取巧的想法是
- 设x是多数元素, 则x的个数要超过其他元素的个数总和
- 设count是当前x的个数
- 何如比较x和其他元素的总个数呢
- 遍历数组
- 如果count == 0, 说明前面的元素都抵消了, 即前面的元素有成对不一样的, 剩下的数组也一定符合题意
- 假定当前元素就是多数元素, 继续遍历
- 将count重制为1
- 如果当前元素与x相同
- 计数加一
- 如果当前元素与x不同
- 计数减一
- 遍历结束, 此时x就是数组中相互抵消之后剩下的多数元素
- 遍历数组
- 何如比较x和其他元素的总个数呢
代码
class Solution {
public int majorityElement(int[] nums) {
// 初始化当前假定的多数元素的个数为1
int count = 1;
// 假定第一个元素就是多数元素
int tar = nums[0];
int len = nums.length;
// 遍历数组
for(int i = 1; i < len;i++) {
// 当前遍历的值
int cur = nums[i];
// count = 0, 说明当前遍历前面的元素已经相互一一抵消
if (count == 0) {
// 继续假定当前元素是多数元素
tar = cur;
// 重制count
count = 1;
// count != 0 说明 当前元素有一个元素满足多数元素的要求
} else {
// 当前元素和tar相同
if(cur == tar) {
// 计数加一
count++;
// 当前元素和tar不相同, 抵消一个tar
} else {
// 计数减一
count--;
}
}
}
// 最后没有被抵消的元素就是多数元素
return tar;
}
}