【剑指offer】03.数组中重复的数组

剑指 Offer 03. 数组中重复的数字

知识点:数组;哈希表;萝卜占坑思想

题目描述

找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 3

解法一:暴力法

class Solution { public int findRepeatNumber(int[] nums) { for(int i = 0; i < nums.length-1; i++){ for(int j = i+1; j < nums.length; j++){ if(nums[i] == nums[j]) return nums[i]; } } return -1; } }

时间复杂度:O(N^N);

解法二:数组排序

class Solution { public int findRepeatNumber(int[] nums) { Arrays.sort(nums); for(int i = 0; i < nums.length-1; i++){ if(nums[i] == nums[i+1]){ return nums[i]; } } return -1; } }

时间复杂度:O(N)+O(NlogN);

解法三:哈希表

利用哈希表不重复的性质,如果包括就把其返回,如果不重复就把其加入哈希表;

class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set = new HashSet<>(); for(int i = 0; i < nums.length; i++){ if(set.contains(nums[i])) return nums[i]; else set.add(nums[i]); } return -1; } }

时间复杂度:O(N);
空间复杂度:O(N);构建哈希表的消耗;

解法四:一个萝卜一个坑

充分考虑到题目中的数字范围,正好是0~n-1;所以可以依次将它们归位,如果归位过程中那个坑里有了,那就证明这个重复了;

class Solution { public int findRepeatNumber(int[] nums) { int temp; for (int i = 0; i < nums.length; i++){ while (nums[i] != i){ //i这个位置没归位就一直找下去; if (nums[i] == nums[nums[i]]) return nums[i]; temp = nums[i]; nums[i] = nums[temp]; nums[temp] = temp; } } return -1; } }

时间复杂度:0(N);

体会

一定要用集合的不可重复性;


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15021888.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(38)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【剑指offer】03.数组中重复的数组』
点击右上角即可分享
微信分享提示