题目所属分类
超经典问题 可以选用投票法
原题链接
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
代码案例:输入:nums = [3,2,3]
输出:3
题解
通俗的理解就是数组中有一个数 出现次数比其他所有数的出现次数都多
最优做法是投票法
1、初始化为r = 0,票数c初始化为0
2、当票数为0时,更换候选人,也就是更换当前存的数,将票数重置为1
3、向后遍历数组,遇到相同元素票数加1,否则减1
4、遍历完数组,当前候选人即为数组中出现的多数元素
上面操作方法一定是正确的,假设当前
x
的次数出现最多,假设x
不是返回的答案,又因为x
需要通过与x
不同的数 才会进行消耗,可是与x不同的数的个数 一定 比 x 少,因此x一定不会被完全消耗掉,因此假设矛盾
class Solution {
public int majorityElement(int[] nums) {
int r = 0, c = 0 ;
for(int i = 0 ; i < nums.length ; i++){
int x = nums[i] ;
if(c== 0){
r = x ;
c = 1 ;
}else if(r == x) c++ ;
else c-- ;
}
return r ;
}
}