LeetCode Majority Element

LeetCode解题之Majority Element


原题

给定一个非空的数组,其中某一数值的数量超过数组长度的一半,请找出这个值。

注意点:

例子:

输入: nums = [1, 2, 2, 3, 3, 3, 3]

输出: 3

解题思路

可以通过哈希表记录每个数值出现的次数并找出出现次数最多的数值。不过有一个比较巧妙的思路是,就是不断将数组中两两不同的数同时去除,极端情况是每个其他数值都与一个数量最多的数同时去除,即使这样,最后剩下的数值也是那个数量超过总数一半的数值。具体实现来看,我们可以把需要抵消的数值存起来,并记录它的数量,这个数量表示它还能抵消掉几个不同的数值。遇到与它不同的数值就减一,遇到相同的就加一。如果数量变为0,那说明这个数暂时已经完全去除了。我们可以用下一个数值继续与其它的数值相抵消。遍历完整个数组后,还没抵消掉的数值就是要求的结果。

AC源码

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


if __name__ == "__main__":
    assert Solution().majorityElement([1, 2, 2, 3, 3, 3, 3]) == 3
    assert Solution().majorityElement([3, 3, 3, 3, 1, 1, 2]) == 3

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值