LeetCode 229 [Majority Element II]

原题

给定一个整型数组,找到所有主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。

给出数组**[1,2,1,2,1,3,3] **返回 1

解题思路

  • 三三抵消,最后会剩下两个candidates,但是注意此时不是谁占多数谁是最终结果,反例[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 4, 4] 三三抵消后剩下 [1, 4,4] 4数量占优,但结果应该是1,所以三三抵消后,再loop一遍找1和4谁数量超过了len(nums)/3

完整代码

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        candidate1, count1 = None, 0
        candidate2, count2 = None, 0
        for num in nums:
            if candidate1 == num:
                count1 += 1
            elif candidate2 == num:
                count2 += 1
            elif count1 == 0:
                count1 += 1
                candidate1 = num
            elif count2 == 0:
                count2 += 1
                candidate2 = num
            else:
                count1 -= 1
                count2 -= 1
                
        count1, count2 = 0, 0
        for num in nums:
            if num == candidate1:
                count1 += 1
            if num == candidate2:
                count2 += 1
                
        result = []
        if count1 > len(nums) / 3:
            result.append(candidate1)
        if count2 > len(nums) / 3:
            result.append(candidate2)
        return result
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Medium, 用时20分钟, 还是Boyer-Moore Majority Vote algorithm. 此题...
    Flashpacker阅读 3,150评论 0 0
  • 首先,一个数组中出现次数大于n/3的数字最多只可能有两个,所以建立两个候选数字。再遍历数组,若和其中一个候选数字相...
    尴尴尬尬先生阅读 2,350评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,351评论 0 33
  • 沙拉讲是一个视频辩论APP 平台提供话题,用户通过录制视频的方式选择立场,表达自己的观点。 我们的学习生活中会面对...
    贵将阅读 2,823评论 0 0
  • 前有一声 萦绕耳边 日夜不停 今有一惑 苦自思量 夜夜无眠 曾几何时 一歌 名何 颜如许 若弦撩动止水心 弦何在 ...
    dear依子阅读 1,235评论 0 1