LeetCode刷题笔记第169题:多数元素

LeetCode刷题笔记第169题:多数元素

要找到数组中超过数组一半长度的元素

想法一:

遍历整个数组用字典来存储每个数字出现的次数,找到出现次数超过数组一半长度的元素。
时间复杂度为:O(n)
空间复杂度为:O(n)

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        if len(nums) == 1:  # 当数组长度为1时无需判断,直接返回该元素
            return nums[0]
        else:
            nums_dict = {}  # 建立一个空字典
            for i in nums:  # 遍历整个数组,记录数组中各个元素出现的次数
                if i in nums_dict:
                    nums_dict[i] += 1
                else:
                    nums_dict[i] = 1
            for k, v in nums_dict.items():  # 找到超过数组长度一半的元素
                if v >= len(nums)/2:
                    return k

想法二:

数组中存在超过数组长度一半的元素,则将数组从小到大或从大到小的排序后,最中间的元素则为超过数组长度一半的元素。
时间复杂度:O(nlog⁡n)。将数组排序的时间复杂度为 O(nlog⁡n)。
空间复杂度:O(log⁡n)。如果使用语言自带的排序算法,需要使用 O(log⁡n)的栈空间。如果自己编写堆排序,则只需要使用 O(1)的额外空间。

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        nums.sort()
        return nums[len(nums) // 2]

想法三:

因为超过数组一半长度的元素个数大于所有其他元素的数量,遍历整个数组从数组开始记录,若后一个元素与当前记录的元素相同则记录加一,否则减一,当记录为0时转换记录的数组元素,最终记录的数组元素为超过数组长度一半的元素。
时间复杂度:O(n)
空间复杂度:O(1)

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        # 摩尔投票法
        # 设置major表示多数数值
        major = 0
        # 设置count计数
        count = 0
        # 通过循环获取数组中元素数值
        for n in nums:
            # 当计数值为0时,将当前数值赋给major
            if count == 0:
                major = n
            # 如果当前数值与major相等则计数加一
            if n == major:
                count += 1
            # 否则计数减一
            else:
                count -= 1
        # 返回major的数值
        return major
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值