日新刷题 - 169. 多数元素

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

169. 多数元素 - 力扣(LeetCode) (leetcode-cn.com)

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:[3,2,3]
输出:3

示例 2:

输入:[2,2,1,1,1,2,2]
输出:2

  进阶:

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

二、思路分析:

既然是寻找出现次数过半的数,假设第一个元素是我们所需要求的值(major_num),同时设置一个计数器。然后遍历数组中的元素,如果是我们要找的值,计数器加一,否则计数器减一。如果计数器的值为零,就将major_num更新为当前元素的值,继续统计,直到数组遍历完成。返回major_num即可。

注:但是事实上真是如此么?例如[1,1,2,2,3]
nums[i] 1 1 2 2 3
count 1 2 1 0 1
major_num 1 1 1 1 3
事实上这时候只需要再遍历一次数组即可,即判断所求值出现次数是否大于一半。
当然题目明确要求了存在所求的值,因此直接返回

三、AC 代码:


class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        nums_len=len(nums)
        count=0
        major_num=nums[0]
        for i in range(nums_len):
            if major_num==nums[i]:
                count+=1
            else:
                if count>0:
                    count-=1
                else:
                    major_num=nums[i]
                    count=1
        return major_num

        '''
        count=0
        for i in range(nums_len):
            if nums[i]==major_num:
                count+=1
        if count>nums_len//2:
            return major_num
        '''     

四、参考:

169. 多数元素 (直接sort/哈希/摩尔投票算法 细致注释) - 多数元素 - 力扣(LeetCode)

摩尔投票只对重复个数大于整个数组元素个数1/2才可使用 - 多数元素 - 力扣(LeetCode)