投票法

题目描述

给定一个大小为 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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务