前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >画解算法:面试题3. 数组中重复的数字

画解算法:面试题3. 数组中重复的数字

作者头像
FunTester
发布于 2020-04-03 07:35:10
发布于 2020-04-03 07:35:10
49400
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

题目链接

https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

题目描述

找出数组中重复的数字。

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

示例 1:

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

限制:

2 <= n <= 100000

解题方案

思路 1

  • 标签:哈希
  • 使用 HashSet 来进行处理,因为 HashSet 本身不允许出现重复元素,所以当添加元素失败或已经包含该数字时,则表示出现了重复元素,将其返回即可。思路较为简单,就不给图了
  • 时间复杂度:O(n),空间复杂度:O(n)

代码 1

  • Java 版本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> numsSet = new HashSet<>();
        for(int num: nums) {
            if(!numsSet.add(num)) {
                return num;
            }
        }
        return -1;
    }
}
  • JavaScript 版本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    const numsSet = new Set();
    for(const num of nums) {
        if(numsSet.has(num)) {
            return num;
        } else {
            numsSet.add(num);
        }
    }
    return -1;
};

思路 2

  • 标签:哈希
  • 从题目描述中我们可以看出,因为所有数字都在 0 ~ n-1 的范围内,其实完全可以省掉额外的空间开辟,将每个位置的数交换映射到其对应的数组下标下面,当出现新的元素与其对应的下标中的数字相等时,即为重复数字
  • 这本质还是哈希的思想,思路 1 是使用库函数申请额外空间,思路 2 则是数组本身做哈希表,达到了节省空间的目的
  • 此处会用到 while 循环,原因是保证交换过来的新元素位置也要正确
  • 时间复杂度:O(n),空间复杂度:O(1)

代码 2

  • Java 版本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public int findRepeatNumber(int[] nums) {
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            while (nums[i] != i) {
                if (nums[i] == nums[nums[i]]) {
                    return nums[i];
                }
                int temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }
        return -1;
    }
}
  • JavaScript 版本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    const len = nums.length;
    for (let i = 0; i < len; i++) {
        while (nums[i] != i) {
            if (nums[i] == nums[nums[i]]) {
                return nums[i];
            }
            const temp = nums[i];
            nums[i] = nums[temp];
            nums[temp] = temp;
        }
    }
    return -1;
};

画解 2

横滑见完整画解

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
剑指 offer 面试题精讲图解 | 03 . 数组中重复的数字
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字。
五分钟学算法
2020/05/29
5080
剑指 offer 面试题精讲图解 | 03 . 数组中重复的数字
剑指 Offer 03. 数组中重复的数字
思路很简单啊,我们只需要遍历一遍数组,然后遇到重复的数字就结束遍历返回结果。我们需要使用集合来存放遍历时出现的数字,如果遍历时发现数字已经出现在集合中,则这个数字是重复数字。
Regan Yue
2023/02/13
2450
剑指 Offer 03. 数组中重复的数字
剑指Offer题解 - Day5
在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
chuckQu
2022/08/19
2480
画解算法:219. 存在重复元素 II
https://leetcode-cn.com/problems/contains-duplicate-ii/
灵魂画师牧码
2019/07/11
3550
画解算法:219. 存在重复元素 II
剑指Offer(三) 数组中重复的数字
这里的空间复杂度则变为 O(n),因为哈希表需要申请额外的 n 个空间,这里用到的是典型的空间换时间的思想。
宇宙无敌暴龙战士之心悦大王
2022/01/10
1960
剑指Offer(三)  数组中重复的数字
《剑指 offer》刷题记录之:数组
题目中的限制可以让我们不用去判断数组是否为空。一种比较简单的方法是先把输入的数组「排序」,再从排序的数组中找出重复的数字。但是排序一个长度为 n 的数组一般需要较大的时间与空间复杂度,以归并排序为例,其时间复杂度为
口仆
2020/08/14
8770
六十六、Leetcode数组系列(中篇)
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。决定今天比昨天要更加努力。前面文章,点击下面链接
润森
2020/06/16
5580
剑指offer第1题:数组中的重复数字
之前的刷题都是随心所欲的刷,没有按照什么章程来给各位小伙伴展现。本周开始,小白把LeetCode上面的《剑指offer》,逐一的进行分享吧~会在公众里面开一个专栏,有兴趣的小伙伴的可以在公众号里面查看的哈~每次分享的解法小白尽量选择简单易懂的解法,对于一些数学方法,咱们没必要考虑那么多,原因很简单不实用。
鹏-程-万-里
2020/07/03
3860
【小Y学算法】⚡️每日LeetCode打卡⚡️——47.存在重复元素
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false
呆呆敲代码的小Y
2021/10/08
3620
剑指offer | 面试题38:数组中的逆序对
「归并排序」与「逆序对」是息息相关的。归并排序体现了 “分而治之” 的算法思想,具体为:
千羽
2022/02/23
1K0
剑指offer | 面试题38:数组中的逆序对
面试题03. 数组中重复的数字
找出数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
lexingsen
2022/02/24
1480
001. 两数之和 | Leetcode题解
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
苏南
2020/12/16
7380
001. 两数之和 | Leetcode题解
剑指 Offer 03. 数组中重复的数字
2.用哈希表遍历如果这个数字为key的value为0则+1,不为0直接return。时间复杂度O(n),空间复杂度O(n)。
SakuraTears
2022/01/13
2250
剑指 Offer 03. 数组中重复的数字
LeetCode题解—重复数字
本来今天应该继续说Android系统方面的知识,但是我发现内容有点多,写不完了?。 那,为了保证文章的质量,所以今天就发一篇算法题顶上了~❤️ 算法题也是面试常考的项,之前也说过,虽然用到的比较少,但
码上积木
2021/01/25
4670
LeetCode通关:数组十七连,真是不简单
数组基本上是我们最熟悉的数据结构了,刚会写“Hello World”不久,接着就是“杨辉三角”之类的练习。
三分恶
2021/08/10
3940
剑指Offer 面试题03. 数组中重复的数字
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
手撕代码八百里
2020/07/29
2270
剑指offer - 数组中重复的数字 - JavaScript
题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
心谭博客
2020/04/21
1K0
剑指Offer - 面试题3. 数组中重复的数字(哈希)
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
Michael阿明
2020/07/13
2670
剑指 Offer 03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
韩旭051
2020/09/01
2400
剑指 03— 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
Java架构师必看
2021/05/14
6190
相关推荐
剑指 offer 面试题精讲图解 | 03 . 数组中重复的数字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文