力扣每日一题442.数组中的重复数据

在这里插入图片描述

题目链接:https://leetcode-cn.com/problems/find-all-duplicates-in-an-array/

这个题第一眼感觉并不难,但仔细一看就会发现端倪,题目中要求的时间复杂度是O(n)比较正常,但是,额外的空间复杂度为常数级(O(1))这就注定了没法使用hashmap记录每个数出现的次数。
但是既然没办法用hashmap,那么我们怎样记录数据呢?

  • 可以利用索引!
  • 因为题目中说明了,每个数都在1到n(列表长度是n)之间,故不存在负数。
  • 我们在遍历的时候,如果遇到1, 我们就在列表中把索引为0的数加上一个负号,表示该数已经遍历过了,如果以后在遍历数组的时候,发现对应的索引指定的值小于0,就说明该数已经出现一次,我们就把它记录到ans中
  • 具体代码实现如下:
class Solution:
    def findDuplicates(self, nums: List[int]) -> List[int]:
        if len(set(nums)) == len(nums):
            return []
        ans = []
        for i in range(len(nums)):
            if nums[abs(nums[i]) - 1] < 0:
                 ans.append(abs(nums[i]))
            else:
                nums[abs(nums[i]) - 1] = -nums[abs(nums[i]) - 1]
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值