[LeetCode]169.Majority Element

  • description
    Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
    You may assume that the array is non-empty and the majority element always exist in the array.

  • 解题思路
    题意是给出一个包含n个元素的数组,找到出现次数超出一半的数,且假定数组非空,一定有满足条件的majority element存在。从题意看,这个majority element出现的次数至少要比其它数出现的总次数多一次,有个简单的方法就是可以记录下数组中每个数字出现的次数,最后判断出现次数最多的数即为majority element,但是这个需要一定的空间去存储每个数字出现的次数,所以这种方法就不是很好。

    换一个思路考虑,在这n个数中,我们每次排除两个不同的数字,由于majority element出现次数比其它数字总的还要多,那么剩余的肯定是majority element。假设数组为{1,3,11,2,1,1,9,1,1},其中1是majority element,如果每次都拿数组中的1个元素‘1’去跟别的元素进行排除,(1,3),(1,11),(1,2),(1,9)这四对元素都排除掉,那么最终只剩一个元素即majority element “1”。再深入思考,当我们每次排除的两个不同元素里不一定有元素‘1’的时候,那么最后剩余的则会有多个元素‘1’。接下来如何转换成代码呢,既然我们每次要排除两个不相同元素,我们就可以遍历一遍这个数列依次排除,那么怎样做到排除掉一个元素呢,我们可以从头开始,将第0个元素假设为majority element,并且用count记录这个被假设为majority element出现的次数,如果下一个元素与假设的majority element 相同,那么count加一;如果不同,那么count减一,证明排除掉了这两个元素;当count为0时,证明前面的元素都因两两不同而被排除了,此时将下一个元素作为majority element,并将count重新设为1,继续遍历下去,根据我们上面文字性的推导,可以知道我们最终会得到majority element并且count会大于等于1。

  • 代码如下

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n = nums.size();
        int majority_ele ;
        int count = 0;
        for(int i = 0; i < n ;i++){
            //当count为0时,将下一个元素假定为majority element
            if(count == 0){
                majority_ele = nums[i];
                count++;
            }
            else{
                //如果下一元素与假定的majority element相等,count++ 
                if(nums[i] == majority_ele){
                    count++;
                }
                //如果不等就count--,即排除掉这两个元素
                else{
                    count--;
                }
            }
        }
        return majority_ele;
    }
};

LeetCode题目原址
如有错误请指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值