今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字

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

一、题目描述

找出数组中重复的数字。

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

示例 1:

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

限制:

2 <= n <= 100000

二、题目解析

注意题目描述:一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的 范围 内,这个 范围 恰好与数组的下标可以一一对应。

所以我们可以执行某种操作,使索引与值一一对应即索引 0 的值为 0,索引 1 的值为 1。而一旦某个索引的值不只一个,则找到了重复的数字,也即发生了 哈希冲突

三、动画描述

剑指 offer 面试题精选图解https://www.zhihu.com/video/1247967705543700480

四、图片描述

五、参考代码

class Solution {public int findRepeatNumber(int[] nums) {//设索引初始值为 i = 0int i = 0;//遍历整个数组 nums while(i < nums.length) {//索引 i 的值为 i,无需执行交换操作,查看下一位if(nums[i] == i) {i++;continue;}//索引 nums[i] 处的值也为 nums[i],即找到一组相同值,返回 nums[i] 即可if(nums[nums[i]] == nums[i]) return nums[i];//执行交换操作,目的是为了使索引与值一一对应,即索引 0 的值为 0,索引 1 的值为 1int tmp = nums[i];nums[i] = nums[tmp];nums[tmp] = tmp;}//如果遍历整个数组都没有找到相同的值,返回 -1return -1;}
}

六、复杂度分析

时间复杂度

遍历数组需要 O(N) 时间。

注意参考代码里面的关键字 continue,这表示在 while 的一次循环里面,只有这次循环将 索引(i)索引值(num[i]) 匹配到了,才会执行下一次循环。

在每一次的循环过程中,索引(i)索引值(num[i]) 匹配到后,在后续的循环过程中不会操作它们,所以虽然一开始的循环过程中,执行的交换操作较多,但在后续的循环过程中根本不需要再执行操作了。

根据均摊复杂度分析 ,总的时间复杂度为 O(N) ,N 为数组的长度。

空间复杂度

使用常数复杂度的额外空间,为 O(1)

七、相关标签

  • 数组
  • 哈希
  • 原地哈希

最后,如果你对学算法感兴趣的话,可以查看简介一起交流学习算法:)

我的专栏:

和程序员小吴一起学算法​zhuanlan.zhihu.com

我的其它相关回答:

程序员必须掌握哪些算法?​www.zhihu.com

字节跳动面试难吗,应该如何应对?​www.zhihu.com

大家都是如何刷 LeetCode 的?​www.zhihu.com

算法网站推荐?​www.zhihu.com

两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字相关推荐

  1. 二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找

    点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:程序员吴师兄 今天分享的题目来源于 LeetCode 上的剑指 Offer ...

  2. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  3. 剑指offer——面试题8:旋转数组的最小数字

    剑指offer--面试题8:旋转数组的最小数字 Solution1: 自己想的复杂度为O(n)O(n)O(n)的算法,若用二分查找则: 1.代码复杂:2.最坏情况下的二分查找的时间复杂度亦为O(n)O ...

  4. 剑指offer——面试题57:删除链表中重复的结点

    剑指offer--面试题57:删除链表中重复的结点 Solution1: 删两遍,自己想的破算法.理论上时间复杂度也是O(n)O(n)O(n),并非最优解. /* struct ListNode {i ...

  5. 剑指offer——面试题55:字符流中第一个不重复的字符

    剑指offer--面试题55:字符流中第一个不重复的字符 Solution1: 当年第一次做这个题的做法 对此题最大的感想是: 1)区分deque(双端队列)和queue(队列): 2)要熟悉queu ...

  6. 剑指offer——面试题33:把数组排成最小数

    剑指offer–面试题33:把数组排成最小数 Solution1: 20180904复习.重点记忆比较技巧!!! 代码参考网址:https://www.nowcoder.com/profile/416 ...

  7. 剑指offer——面试题14:调整数组顺序使奇数位于偶数前面

    剑指offer--面试题14:调整数组顺序使奇数位于偶数前面 Solution1: 顺序交换,比较好的算法!!! class Solution { public:void reOrderArray(v ...

  8. java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...

    推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...

  9. java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

最新文章

  1. debian linux 硬盘,[Debian] 硬盘安装Debian,
  2. 网页制作获得用户喜爱才是重点!
  3. Git之深入解析如何使用Git调试项目源码中的问题
  4. easyswoole数据库连接池_easyswoole orm配置数据库连接
  5. 负margin应用案例几则(转载+总结)
  6. (50)FPGA面试题消除一个glitch实现
  7. Android 内存管理之优化建议
  8. python字符串find方法(二分钟读懂)
  9. golang 微信小程序登录
  10. 五险一金 ,即将毕业的每个人都看看吧
  11. Android:支付宝sdk支付回调错误码4000
  12. QT VS2019 OpenCV yolo4 摄像头识别人脸
  13. 云原生(三十九) | Kubernetes篇之kustomize入门了解
  14. EVM源码解读(1):amplify_spatial_lpyr_temporal_iir函数
  15. C语言之栈实现(详细)
  16. 【技术公开课】Redis从入门到实践
  17. 笔试逻辑智力题找规律题总结2
  18. 在centos上连接sftp服务器
  19. 企业级的商用远程控制软件有哪些
  20. codeforces-1084AThe Fair Nut and Elevator-题解

热门文章

  1. pymysql使用变化的变量,构造SQL语句
  2. Maven解决Failed to instantiate SLF4J LoggerFactory报错
  3. linux安装.AppImage后缀安装包
  4. pandas导出的csv文件用mysql-workbench导入报错
  5. Storm之路-WordCount-实例
  6. spring MVC 项目 WEB-INF下的jsp不能加载css文件
  7. 机器学习笔记2 – sklearn之iris数据集
  8. webform快速创建表单内容文件--oracle 数据库
  9. sshd被攻击的自动防御方法v2
  10. 【VS开发】文件夹和文件选择EditBrowe控件使用