投票法
题目描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
想法:
在一个存在出现次数超过[n/2]的数组里,如果我们把众数记为 +1 ,把其他数记为 −1 ,将它们全部加起来,显然和大于 0 ,从结果本身我们可以看出众数比其他数多。因此,我们只需要两个变量,就能实现在O(n)的时间和O(1)的空间做到找到数组中出现次数超过[n/2]的数。我们维护一个计数器,如果遇到一个我们目前的候选众数,就将计数器加一,否则减一。只要计数器等于 0 ,我们就将数组之前访问的数字全部忘记 ,并把下一个数字当做候选的众数。
实施步骤:
首先第一个数x,用来记录到出现次数最多的数,第二个数count,用来记录次数。每读入一个数,当count=0时,就更新当前这个数为x,count++。否则如果这个数和x相同,count++,如果和x不同,count--。遍历结束后x就是我们要找的数。因为众数大于其他数出现次数之和,因此众数不可能被消去,也就是只有众数会留下来。
class Solution {
public int majorityElement(int[] nums) {
int mnum,count;
count = 0;
mnum = nums[0];
for(int i:nums){
if(count == 0){
mnum = i;
}
if(mnum == i){
count += 1 ;
}else{
count -= 1 ;
}
}
return mnum;
}
}练习题目:
1.https://www.nowcoder.com/pat/1/problem/4093
2.leetcode 169
3.leetcode 229
海康威视公司福利 1182人发布