前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >剑指Offer题解 - Day5

剑指Offer题解 - Day5

作者头像
chuckQu
发布于 2022-08-19 02:47:23
发布于 2022-08-19 02:47:23
24800
代码可运行
举报
文章被收录于专栏:前端F2E前端F2E
运行总次数:0
代码可运行

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

力扣题目链接[1]

找出数组中重复的数字。

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

示例 1:

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

限制:

  • 2 <= n <= 100000

思路:

首先考虑使用哈希表存储数组中的值。遍历数组的时候判断哈希表中时候存在该值,如果存在直接返回该值,否则存入哈希表。

哈希表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    let map = new Map(); // 新建哈希表用来存储数组中的值
    for (let i = 0; i < nums.length; i++) {
    let value = nums[i]; // 缓存当前值
        if (map.has(value)) return value; // 如果存在于哈希表,则返回当前值
        map.set(value, true); // 否则存储
    }
};
  • 空间复杂度:O(n)。
  • 时间复杂度:O(n)。

分析:

该解法是用空间换时间的典型处理方案。使用额外的内存维护哈希表,很方便的存取数组的值。该思路也可以用来统计数组中值出现的次数,并进行排序。

原地交换

根据题目描述,所有数字都在 0 ~ n-1 的范围内。但是上述题解并没有用到该条件。根据此条件,可以得出一个结论:数组元素的 「索引」「值」「一对多」 的关系。

因此,我们可以:通过遍历数组,同时交换元素。使得元素的「索引」「值」一一对应。也就是nums[i] === i 这种关系。当遇到第一个nums[nums[i]] === nums[i] ,我们就找到了重复元素nums[i]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    let i = 0; // 初始化索引
    while(i < nums.length) {
        let value = nums[i]; // 缓存当前值,会多次用到
        if (value === i) { // 如果当前索引和当前值相等,则意味着一一对应,继续下一次循环
            i++; // 索引右移
            continue;
        }
        if (nums[value] === value) return value; // 如果nums[nums[i]] === nums[i],则当前值就是重复的值
        nums[i] = nums[value]; // 交换索引i和nums[i]的值,将nums[nums[i]]放至正确的位置
        nums[value] = value;
    }
    return -1; // 如果没有重复元素,则返回-1
};
  • 空间复杂度:O(1)。
  • 时间复杂度:O(n)。

分析:

上述题解的主要思路是将元素的索引和值一一对应,当遇到后面的值等于前面索引的时候,则意味着有重复元素。

总结

本题两个题解,分别体现了哈希表的特点和利用题目本身的要求来实现。原地交换不需要额外的空间来存储,该方法更胜一筹。遇到数组等问题,要优先考虑原地交换或者指针来进行解题。

参考资料

[1]力扣题目链接: https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/59bjss/

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
剑指offer - 数组中重复的数字 - JavaScript
题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
心谭博客
2020/04/21
1K0
剑指 offer 面试题精讲图解 | 03 . 数组中重复的数字
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字。
五分钟学算法
2020/05/29
5080
剑指 offer 面试题精讲图解 | 03 . 数组中重复的数字
剑指 Offer 03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
Zoctopus
2022/05/10
1840
剑指Offer题解 - Day6
首先考虑通过遍历数组进行查找重复次数。该方法没有合理利用有序数组的前提条件,适合无序数组的元素统计。
chuckQu
2022/08/19
1430
剑指offer(一):找出数组中重复的数字
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字 2 或者 3。
程序员小浩
2020/08/04
6560
【算法题解】 Day20 查找
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
sidiot
2023/08/26
2710
剑指offer|03. 数组中重复的数字
借助Set,如果add方法返回false,则意味着有数据重复。或者使用contains方法,判断是否已有数据存在,如有则意味着该数据重复。
孟君
2023/02/23
2110
剑指offer|03. 数组中重复的数字
画解算法:面试题3. 数组中重复的数字
https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
FunTester
2020/04/03
4940
画解算法:面试题3. 数组中重复的数字
TypeScript算法题实战——剑指 Offer篇(1)
Typescript 是 Javascript 的超集。Typescript 为 Javascript 增加类型能力,主要为了避免 JS 弱类型下产生的各种有意无意的问题。Typescript 的出现大大改善了开发体验,增强了代码的可维护性和稳定性,如今已被越来越多的大型前端项目选用。
中杯可乐多加冰
2024/08/13
720
剑指Offer题解 - Day36
从「若干副扑克牌」中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。2 ~ 10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
chuckQu
2022/08/19
1870
剑指 03— 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
Java架构师必看
2021/05/14
6190
剑指Offer题解 - Day49
一个整型数组nums里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n),空间复杂度是 O(1)。
chuckQu
2022/08/19
1620
剑指Offer题解 - Day50
在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
chuckQu
2022/08/19
1530
剑指 Offer(C++版本)系列:剑指 Offer 03 数组中重复的数字
同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree 剑指 Offer(C++版本)系列:总目录和一些提高效率的说明 剑指 Offer(
我是管小亮
2021/07/20
3700
LeetCode通关:数组十七连,真是不简单
数组基本上是我们最熟悉的数据结构了,刚会写“Hello World”不久,接着就是“杨辉三角”之类的练习。
三分恶
2021/08/10
3940
一天一大 leet
给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。
前端小书童
2020/09/24
3570
一天一大 leet
剑指Offer(三) 数组中重复的数字
这里的空间复杂度则变为 O(n),因为哈希表需要申请额外的 n 个空间,这里用到的是典型的空间换时间的思想。
宇宙无敌暴龙战士之心悦大王
2022/01/10
1960
剑指Offer(三)  数组中重复的数字
LeetCode-剑指offer
首刷剑指offer,刷起来还是比较吃力,大多数题需要看题解才能做出来,甚至有的看了题解都不懂😭,我是废物,希望第二次刷的时候大部分题都能自己做出来吧!!! 剑指Offer 简单 中等 困难 38道 31道 6道 第 1 天 栈与队列 09. 用两个栈实现队列 题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入
小简
2023/01/30
1.3K0
剑指Offer题解 - Day7
一个长度为 n-1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 ~ n-1 之内。在范围 0 ~ n-1 内的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。
chuckQu
2022/08/19
1700
剑指Offer题解 - Day27
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
chuckQu
2022/08/19
2510
相关推荐
剑指offer - 数组中重复的数字 - JavaScript
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文