投票法
题目描述
给定一个大小为 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