点击关注上方“五分钟学算法”,

设为“置顶或星标”,一起成长

今天分享的题目来源于 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。而一旦某个索引的值不只一个,则找到了重复的数字,也即发生了 哈希冲突

三、动画描述

四、图片描述

五、参考代码

class Solution {    public int findRepeatNumber(int[] nums) {        //设索引初始值为 i = 0        int i = 0;        //遍历整个数组 nums         while(i             //索引 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 的值为 1            int tmp = nums[i];            nums[i] = nums[tmp];            nums[tmp] = tmp;        }        //如果遍历整个数组都没有找到相同的值,返回 -1        return -1;    }}

六、复杂度分析

时间复杂度

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

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

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

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

空间复杂度

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

七、相关标签

  • 数组

  • 哈希

  • 原地哈希

今天是 『 365 刷题计划 』 第 41 天。每晚八点,一起图解一道算法题,不见不散!

欢迎关注我的公众号“图解面试算法”,如果喜欢,麻烦点一下“在看”,转发+在看相当于打赏!

将一个数组中不重复_你不知道的解法:数组中重复的数字相关推荐

  1. java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...

    java从数组查找指定整数 自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说 ...

  2. hashset如何检查重复_如何使用 C# 中的 HashSet

    译文链接:https://www.infoworld.com/article/3586972/how-to-use-hashset-in-csharp.html HashSet 是一个优化过的无序集合 ...

  3. 共享内存中使用指针_详解c++中字符指针数组的使用

    之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用. 涛哥:c++中的动态数组使用​zhuanlan.zhihu.com 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...

  4. java在数组中放入随机数_如何在Java中随机播放数组

    java在数组中放入随机数 There are two ways to shuffle an array in Java. 有两种方法可以在Java中随机播放数组. Collections.shuff ...

  5. java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...

  6. php接口返回一个数组怎末写_返回php数组

    PHP数组简介 v 一.PHP数组的分类 按照下标的不同,PHP中的数组分为关联数组和索引数组: 索引数组:下标从0开始,依次增长. $arr=[1,2,3,4,5]; 关联数组:下标为字符串格式,每 ...

  7. 范数在机器学习中的作用_设计在机器学习中的作用

    范数在机器学习中的作用 Today, machine learning (ML) is a component of practically all new software products. Fo ...

  8. mysql中groupby用法_详解SQL中GroupBy的用法

    GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 1.概述 "Group By"从字面意义上理解就是根据"By"指定的规则对数据进行分 ...

  9. python中add函数_如何使用python中的add函数?

    之前向大家介绍过python中的求和函数sum函数,numpy中的sum函数,对于数组可以指定维度进行相加.numpy中还有另一种求和运算方法,即add函数.add函数不仅作用于numpy中加法运算, ...

最新文章

  1. 《剑指offer》c++版本 5.替换空格
  2. 09945 oracle 解决方法_ORACLE rman与RMAN-00054ORA-09945
  3. 使java代码更干净_java如何使用Lombok更优雅地编码
  4. php什么是变量6,PHP变量是什么
  5. 大数据之-Hadoop_1.x和2.x区别---大数据之hadoop工作笔记0012
  6. Firefox关闭最后一个标签页时不关闭Firefox的设置
  7. 驱动重构SDN/NFV奠定未来网络基石
  8. 图像融合(四)-- 对比度金字塔
  9. KML和KMZ 用什么软件打开?
  10. DELPHI7第三方控件安装
  11. Java小开发(汽车租赁系统)
  12. Spring 框架学习—控制反转(IOC)
  13. Taylor Swift -- Crazier 附英文和中文歌词
  14. 物联网方面的竞赛有那些?
  15. 关于Android的方向传感器
  16. M480 EMAC驱动02-IP101G测试
  17. Github上利用win10使用TensorFlow(GPU)上如何去训练一个目标多分类检测的例子
  18. Mybatis学习总结(结合个人理解)
  19. IntelliJ IDEA 快捷键大全(Mac版)
  20. linux开发板tftp 搭建,iTOP-i.MX6ULL开发板-Tftp烧写和Nfs启动

热门文章

  1. 让Python输出更漂亮
  2. springMVC中数据流解析与装载
  3. java 语法 —— 数组
  4. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
  5. BZOJ4448:[SCO2015]情报传递
  6. winform下自绘提示框风格窗体
  7. Hadoop MapReduce执行过程(一)
  8. C语言课后习题(39)
  9. java 开发平台idea_JAVA开发平台intellij idea使用教程:有哪些方法可以实现自动导入...
  10. figtree如何编辑进化树_进化树的注释:ggtree