leetcode讲解--169. Majority Element

169. Majority Element

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.

题目地址

唉,看到这题就想起了,当年,青葱岁月,菜鸡的我做阿里的笔试题,对的,就是这题。当时题目改成了小明收红包,找出现次数超过一般的那个红包,要求线性时间复杂度,也就是说不能用排序(排序算法最优情况是:O(nlogn))。

出现次数超过一半的那个数,我们怎么在O(n)时间复杂度内把它揪出来,我教你:大浪淘沙法,是金子总会发光法,我要打十个法(意思就是,这一个数就能干翻全场剩下的所有数,是不是?因为它超过一半啊)。我们来想象一下:我们遍历这个数组的时候,定义一个count用来计数,这个超过一半的数,它遇到自己就给count加1,遇到不是自己的数,就给count减1,最后会怎样呢,count肯定大于0呐,因为这个数的个数超过一半。好,进一步的,我们先随便找个数当这个老大(个数超过一半),如果它的个数不超过一半,就会在相消中时count为0,那么就把它换掉,最后剩下的那个就是,个数超过一半的那个数了。

代码如下:

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        count = 1
        n = nums[0]
        for x in range(1, len(nums)):
            if count == 0:
                n = nums[x]
                count += 1
            else:
                if nums[x] == n:
                    count += 1
                else:
                    count -= 1
        return n

超过一半呐,多么重的一条信息,稍微想想就知道,用相消法都能消出那个数,跟那个用异或消出只出现一次的数(其它的数都是成对的,就是都恰好有两个)是不是异曲同工呐,嗯还是扯得有点远。

另外这个题在leetcode上的难度是easy哦,好伤心啊,当初的我连这题都没想出解法,真是够年轻啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值