第 31 日:数组中出现次数超过一半的数字
题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/
题目
解题
-
投票法
解题思路:
因为数组中有一个数字出现的次数超过数组长度的一半,如果我们把众数(出现次数超过一半的数字)记为
+1
,把其他数记为−1
,将它们全部加起来,显然和大于0
。
所以,我们可以在遍历的时候设置两个变量zs
、p
分别记录当前数和它的票数。
时间复杂度:O(n)
空间复杂度:O(1)详细代码如下:
class Solution {
public int majorityElement(int[] nums) {
int p=1,zs=nums[0];
for(int i=1;i<nums.length;i++){
if(zs!=nums[i]){
p--;
if(p==-1){
zs=nums[i];
p=1;
}
}else{
p++;
}
}
return zs;
}
}