【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

__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/16070991.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
Live2D
欢迎阅读『【LeetCode】442.数组中重复的数据』
点击右上角即可分享
微信分享提示