一、题目
数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1
。请设计时间复杂度为 O(N)
、空间复杂度为 O(1)
的解决方案。
点击查看原题
难度级别: 简单
二、思路
1)投票+验证
如果一个数出现的次数大于这个数组长度的一半,使用投票算法可以得到这个数:
用候选人变量记录选中的元素和该元素出现的次数,在遍历的时候,如果出现非候选人变量,则候选人变量出现次数减一,当减到0,就更换候选人变量的值为当前遍历到的数组元素,由于主要元素出现次数大于数组长度的一半,一定可以获得主要元素(如果存在的话)
考虑到没有主要元素的情况,需要遍历一遍数组,将候选人变量出现的次数记录一下,判断是否主要元素
三、代码
1)投票+验证
class Solution {
public int majorityElement(int[] nums) {
int num = nums[0];
int cnt = 1;
for (int i = 1; i < nums.length; i++) {
if (num == nums[i]) {
cnt++;
} else {
cnt--;
if (cnt == 0) {
num = nums[i];
cnt = 1;
}
}
}
cnt = 0;
for (int i : nums) {
if (i == num) {
cnt++;
}
}
return cnt > nums.length/2 ? num : -1;
}
}
时间复杂度为O(N)
,空间复杂度为 O(1)