题目链接
多数元素
题目描述
注意点
- 给定的数组总是存在多数元素
- 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素
解答思路
- 初始想到使用map存每个元素和元素出现的次数,但是时间和空间都不理想
- 因为本题给定的数组总是存在多数元素,使用投票算法统计多数元素,遍历整个数组,将第一个元素设置为候选元素,如果当前元素和候选元素相等,则count + 1,否则count - 1;如果count < 0,则要将候选元素修改为当前元素
- 上述投票算法成立的前提是给定的数组总是存在多数元素以及多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素,遍历数组时,多数元素能够抵消所有其他元素并保持其count > 0
代码
class Solution {
public int majorityElement(int[] nums) {
// 初始候选人为数组中的第一个数,初始票数为1
int cand_num = nums[0];
int count = 1;
for (int i = 1; i < nums.length; ++i) {
if (cand_num == nums[i]){
// 如果当前元素与候选人相同,则票数 + 1
count++;
}
else {
// 当前元素与候选人不同,则票数 - 1
count--;
// 如果此时票数小于0,则更换候选人,改变票数为1
if(count < 0) {
cand_num = nums[i];
count = 1;
}
}
}
return cand_num;
}
}
关键点
- 投票算法的思想