Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >剑指 03— 数组中重复的数字

剑指 03— 数组中重复的数字

作者头像
Java架构师必看
修改于 2023-09-25 08:19:11
修改于 2023-09-25 08:19:11
66500
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

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

难度简单372

找出数组中重复的数字。

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:23 

方法一:

利用set集合,如每次添加的时候判重

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
   
    public int findRepeatNumber(int[] nums) {
   
  Set<Integer> set=new HashSet<>();
        for (int num:nums){
   
            if (!set.contains(num)){
   
                set.add(num);
            }else {
   
                return num;
            }
        }
        return 0;
    }
}

复杂性分析

时间复杂度:O(n)

遍历数组一遍。使用哈希集合(HashSet),添加元素的时间复杂度为 O(1),故总的时间复杂度是 O(n)

空间复杂度:O(n)。

不重复的每个元素都可能存入集合,因此占用 O(n)额外空间。

方法二: 原地置换法

  1. 注意:数字的范围与数组的长度相同,我们可以把数组看成哈希表
  2. 把数组的索引看成哈希表的kye,数组的元素看成哈希表的值val
  3. 把值为val的元素放在键也为val的位置上,也就是哈希表键值对的映射关系为key == val
  4. 如果当前数字 nums[i] 和索引 i 不相等,那么应该把 nums[i] 放在索引也为 nums[i] 的位置去,就把索引为 nums[i] 和 i 的数字对换
  5. 如果数组在索引为 nums[i] 位置的数在交换前就已经是 nums[i],说明nums[i]是重复数字,返回nums[i]
  6. 如果交换后在 nums[i] 仍然不等于 i,要继续交换,这是使用while循环的原因
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int findRepeatNumber2(int[] nums) {
   
        for (int i = 0; i < nums.length; i++) {
   
            if (i == nums[i]) {
   
                continue;
            }
            if (nums[i] == nums[nums[i]]) {
   
                return nums[i];
            }
            //交换
            int temp = nums[nums[i]];
            nums[nums[i]] = nums[i];
            nums[i] = temp;
            //这里的i--是为了抵消掉上面的i++,
            //交换之后需要原地再比较
            i--;
        }
        return -1;
    }

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

本文来源面相薪水编程,由javajgs_com转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
剑指 Offer 03. 数组中重复的数字
2.用哈希表遍历如果这个数字为key的value为0则+1,不为0直接return。时间复杂度O(n),空间复杂度O(n)。
SakuraTears
2022/01/13
2310
剑指 Offer 03. 数组中重复的数字
剑指 offer 面试题精讲图解 | 03 . 数组中重复的数字
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字。
五分钟学算法
2020/05/29
5100
剑指 offer 面试题精讲图解 | 03 . 数组中重复的数字
剑指 Offer:03. 数组中重复的数字
1. 题目 剑指 Offer 03. 数组中重复的数字 2. 描述 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 3. 实现方法 3.1 方法 1 3.1.1 思路 定义一个集合 set 来存放数组中出现过
村雨遥
2022/06/16
3750
剑指Offer(三) 数组中重复的数字
这里的空间复杂度则变为 O(n),因为哈希表需要申请额外的 n 个空间,这里用到的是典型的空间换时间的思想。
宇宙无敌暴龙战士之心悦大王
2022/01/10
2100
剑指Offer(三)  数组中重复的数字
剑指offer之找出数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
周杰伦本人
2022/10/25
3000
剑指 Offer 03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
Zoctopus
2022/05/10
1870
面试题03. 数组中重复的数字
找出数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
lexingsen
2022/02/24
1540
剑指 Offer 03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
暴躁的程序猿
2022/05/10
1510
画解算法:面试题3. 数组中重复的数字
https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
FunTester
2020/04/03
5040
画解算法:面试题3. 数组中重复的数字
剑指 Offer(C++版本)系列:剑指 Offer 03 数组中重复的数字
同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree 剑指 Offer(C++版本)系列:总目录和一些提高效率的说明 剑指 Offer(
我是管小亮
2021/07/20
3870
《剑指 offer》刷题记录之:数组
题目中的限制可以让我们不用去判断数组是否为空。一种比较简单的方法是先把输入的数组「排序」,再从排序的数组中找出重复的数字。但是排序一个长度为 n 的数组一般需要较大的时间与空间复杂度,以归并排序为例,其时间复杂度为
口仆
2020/08/14
8890
剑指 Offer 03. 数组中重复的数字
思路很简单啊,我们只需要遍历一遍数组,然后遇到重复的数字就结束遍历返回结果。我们需要使用集合来存放遍历时出现的数字,如果遍历时发现数字已经出现在集合中,则这个数字是重复数字。
Regan Yue
2023/02/13
2520
剑指 Offer 03. 数组中重复的数字
LeetCode通关:数组十七连,真是不简单
数组基本上是我们最熟悉的数据结构了,刚会写“Hello World”不久,接着就是“杨辉三角”之类的练习。
三分恶
2021/08/10
4010
剑指offer第1题:数组中的重复数字
之前的刷题都是随心所欲的刷,没有按照什么章程来给各位小伙伴展现。本周开始,小白把LeetCode上面的《剑指offer》,逐一的进行分享吧~会在公众里面开一个专栏,有兴趣的小伙伴的可以在公众号里面查看的哈~每次分享的解法小白尽量选择简单易懂的解法,对于一些数学方法,咱们没必要考虑那么多,原因很简单不实用。
鹏-程-万-里
2020/07/03
3910
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 题解: 题意如上所示,从数组中随便找一个重复的元素,并输出这个元素即可。 如示例,可以输入2;也可以输出3 //放到集合中,判断add是否成功,如果失败,说明元素
Vincent-yuan
2022/05/06
1860
剑指Offer题解 - Day5
在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
chuckQu
2022/08/19
2530
LeetCode题解—重复数字
本来今天应该继续说Android系统方面的知识,但是我发现内容有点多,写不完了?。 那,为了保证文章的质量,所以今天就发一篇算法题顶上了~❤️ 算法题也是面试常考的项,之前也说过,虽然用到的比较少,但
码上积木
2021/01/25
4790
【每日leetcode】22.数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
一条coding
2021/08/12
3920
【每日leetcode】22.数组中重复的数字
TypeScript算法题实战——剑指 Offer篇(1)
Typescript 是 Javascript 的超集。Typescript 为 Javascript 增加类型能力,主要为了避免 JS 弱类型下产生的各种有意无意的问题。Typescript 的出现大大改善了开发体验,增强了代码的可维护性和稳定性,如今已被越来越多的大型前端项目选用。
中杯可乐多加冰
2024/08/13
760
【每日一题】【leetcode】8. 数组-数组中重复的数字
找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 难易程度:easy
aneutron
2022/08/10
1980
推荐阅读
相关推荐
剑指 Offer 03. 数组中重复的数字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验