leetcode(27)_面试题17.10._easy_主要元素_python

主要元素

题目描述:
数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
示例 :
输入:[1,2,5,9,5,9,5,5,5]
输出:5

解法

  1. 常数级的空间复杂度限制了不能使用哈希表统计各元素出现的次数,只能简单进行迭代,用几个变量来记录结果。这里直接介绍摩尔投票的算法。
  2. 对于个数大于总数一半的元素而言,如果与不同于自身的元素进行抵消,最终仍会有剩余。基于此,先遍历数组,初始时设置一个候选众数,遇到不同的元素就进行抵消;如果完全抵消就换新的候选众数;最终的候选人便有可能是众数,但其他元素因为没有“存活”到最后,必然不是众数。
  3. 这里解释一下为什么最终候选人不一定是众数,例如数组[1, 2, 2, 1, 3],前面元素 1 和 2 相互抵消,最终剩下元素 3 坐收渔翁之利,但显然它不是众数。所以最后还需要统计候选人在数组中的总次数,如果确实大于一半,那就说明是众数;否则不是。
代码
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        cur_num, cnt, total_cnt = 0, 0, 0
        for num in nums:
            if cnt == 0:
                cur_num = num
                cnt = 1
            else:
                cnt += 1 if cur_num == num else -1
        for num in nums:
            if num == cur_num:
                total_cnt += 1
        return -1 if cnt == 0 or total_cnt <= len(nums) // 2  else cur_num
      
测试结果

执行用时:48 ms, 在所有 Python3 提交中击败了 82.01% 的用户
内存消耗:16.3 MB, 在所有 Python3 提交中击败了 5.10% 的用户

说明

算法题来源:力扣(LeetCode)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值