【LeetCode】442.数组中重复的数据

283.移动零

知识点:数组;原地哈希

题目描述

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。##### 示例

输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]

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

输入:nums = [1]
输出:[]

解法一:原地哈希

涉及到这种重复的,其实第一时间应该想到hashset,就遍历一遍,然后把数据都存到哈希集合里,if已经添加过了,那就是重复的;
但是题目要求不能开辟新的空间,那怎么办呢,我们可以自己构建一个哈希表,这个哈希表就是我们本身的数组,想一下我们为什么需要哈希,因为哈希有快速查找的特性,也就是能在1时间复杂度查找是否包含,那我们可以用这个原始数组来标记是否出现过,怎么做呢,正好发现这个数组的范围就是1-n,那我们就可以把元素x用第x个位置上的元素去做标记,比如说,我们可以给这个位置上的元素都加上一个数字n,等到它自己的时候再减去这个数n,这样也不影响人家本身,if出现过两次,那这个数一定是大于2n的,这不就判断出来了吗?再或者,我们可以直接去取反,当用到人家自己的时候再用绝对值就行了,if发现这个元素是负的,那证明这是出现的第二次了。就是这个思想,其实就是在原地构建了一个哈希表;

class Solution:
    def findDuplicates(self, nums: List[int]) -> List[int]:
        size = len(nums)
        res = []
        for i in range(size):
            index = abs(nums[i])   #用这个数字要先取绝对值;
            if nums[index-1] < 0:
               res.append(index)
            nums[index-1] = -1 * nums[index-1]
        return res 
posted @ 2022-03-29 11:46  Curryxin  阅读(87)  评论(0编辑  收藏  举报
Live2D