Leetcode-229题:Majority Element2

题目:Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

思路:现在要求找出出现次数大于n/3的数字,那么这个数字可能不存在,可能有1个,也可能有2个。如果不要求空间复杂度是O(1)的话,只要扫描一遍数组统计各个数字出现的次数即可。但要求O(1)空间复杂度就只能通过维护几个计数器来完成任务,那么就应该通过一种方法来缩小候选的数字集合,缩小到常数个。所采用的方法与169题相似,每次删除三个不同的数字,直到不存在三个不同的数字。这时要注意的是,满足要求的数字一定出现在剩余数字中,但是剩余数字不一定都满足要求,可通过再一次扫描数组,统计出剩余的数字出现的次数,判断是否满足要求即可。

代码:

def majorityElement(self, nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    if nums == None:
        return None
    result = []
    num_counter = {}
    for n in nums:
        if n in num_counter:
            num_counter[n] += 1
        elif len(num_counter) < 2:
            num_counter[n] = 1
        else:
            for k,v in num_counter.items():
                if v == 1:
                    num_counter.pop(k)
                else:
                    num_counter[k] -= 1
    for k in num_counter.keys():
        num_counter[k] = 0
    for n in nums:
        if n in num_counter:
            num_counter[n] += 1
    for k,v in num_counter.items():
        if v > len(nums)/3:
            result.append(k)
    return result
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,973评论 0 33
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,323评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,837评论 0 15
  • 夜读《项脊轩志》,世态变迁,几经兴废。以生活中桩桩琐事反映出几世沧桑悲情,在颓废、混乱、衰落中仍然不曾失去摆脱命运...
    舒己阅读 386评论 1 1
  • 【5.11】 子贡曰:“我不欲人之加诸我也,吾亦欲无加诸人。”子曰:“赐也,非尔所及也。” 【傅佩荣译文】 子贡说...
    jnvivian阅读 409评论 0 0

友情链接更多精彩内容