图解面试题:找出数组中重复的数字?

今天分享的题目来源于 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 = 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)


往期推荐

多图证明,Java到底是值传递还是引用传递?

2020-09-02

面试系列第2篇:回文字符串判断的3种方法!

2020-08-24

面试系列第1篇:常见面试题和面试套路有哪些?

2020-08-21

关注下方二维码,收获更多干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb中picturebox透明时看到下面的picturebox中图片

在加载窗体时&#xff0c;把PictureBox1的背景指定为透明&#xff0c;再把PictureBox1指定为PictureBox2的父容器就可以实现PictureBox2透明于PictureBox1且都透明与窗体背景了。VB2010环境下的。代码如下&#xff1a; Private Sub Form1_Load(ByVal sender As System.Object, …

Java ObjectStreamClass getSerialVersionUID()方法(带示例)

ObjectStreamClass类getSerialVersionUID()方法 (ObjectStreamClass Class getSerialVersionUID() method) getSerialVersionUID() method is available in java.io package. getSerialVersionUID()方法在java.io包中可用。 getSerialVersionUID() method is used to get the s…

知方可补不足~数据库名称和数据库别名不同了怎么办

回到目录 当你的数据库安装成功后&#xff0c;你修改了计算机名称&#xff0c;这时&#xff0c;你的sqlserver名称与别名可能就不相同了&#xff0c;当这两个名称不相同时&#xff0c;你再使用sql的发布与订阅功能时&#xff0c;将会被提示出错&#xff0c;“请使用服务名称&am…

调研了100+开源博客,发现这5个最好用!

最近想倒腾一下博客&#xff0c;看了很多现成的比较成熟的开源博客系统&#xff0c;自己也简单从下面几个维度总结对比了一下&#xff1a;star 数量技术选型社区生态当然啦&#xff01;好东西不能独享&#xff0c;下面简单分享一下我所做的笔记&#xff08;文末有提供所有项目的…

批处理编程详解

批处理编程详解小引&#xff1a;最近好多猜测弱口令的病毒在网上流行&#xff0c;比如前段时间闹得很厉害的Worm.Dvldr 蠕虫就是一个典型。这些病毒有个共同点就是利用批处理来进行ipc$连接&#xff0c;从而来猜测管理员的口令达到控制服务器的目的。病毒由几个文件和几个复杂的…

Java Object Class boolean equals(Object o)方法与示例

对象类布尔值等于(对象o) (Object Class boolean equals(Object o)) This method is available in package java.lang.Object.equals(Object o). 软件包java.lang.Object.equals(Object o)中提供了此方法。 This method is used to check the object with the specified object…

3种时间格式化的方法,SpringBoot篇!

时间格式化在项目中使用频率是非常高的&#xff0c;当我们的 API 接口返回结果&#xff0c;需要对其中某一个 date 字段属性进行特殊的格式化处理&#xff0c;通常会用到 SimpleDateFormat 工具处理。SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd"…

linux系统怎么改为中文版(转)

linux系统安装好后怎么改为中文版呢&#xff1f;今天就跟大家介绍下linux系统改为中文版的方法&#xff0c;希望能帮助到大家&#xff01; 以下是linux系统改为中文版的四种方法&#xff0c;一起来看看&#xff1a; 方法1&#xff1a;写入环境变量 echo "export LANG"…

写一个头文件

#ifndef _(文件名)_H #define _(文件名)_H #include<标准库头文件> ……&#xff08;所有函数声明&#xff09; #endif 头文件是对函数的声明&#xff0c;在对其引用时用“……”和<……>两种&#xff0c;如果这个头文件是自己写的就用“”&#xff0c;例如#i…

Command10,Access数据库

我的按钮名为Command10&#xff0c;Access文档新建在当前目录下&#xff0c;代码如下Private Sub Command10_Click()Dim cat As ADOX.CatalogSet cat New ADOX.Catalog在当前目录下建立名为newdata的Access数据库cat.Create ("ProviderMicrosoft.Jet.OLEDB.4.0;Data Sour…

b树范围查找_使用段树查找最大查询范围

b树范围查找The following question/problem is asked on http://www.spoj.com/problems/GSS1/ 在http://www.spoj.com/problems/GSS1/上询问以下问题/问题 Problem: 问题&#xff1a; A sequence is given: A[1], A[2], ..., A[N] .( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). …

两难!先更新数据库再删缓存?还是先删缓存再更新数据库?

前言当我们在做数据库与缓存数据同步时&#xff0c;究竟更新缓存&#xff0c;还是删除缓存&#xff0c;究竟是先操作数据库&#xff0c;还是先操作缓存&#xff1f;本文带大家深度分析数据库与缓存的双写问题&#xff0c;并且给出了所有方案的实现代码方便大家参考。本篇文章主…

c++ list sort

1. bool operator < (S & b) {return ID < b.ID;} struct S {std::string firstname;std::string secondname;int ID;bool operator < (S & b) {return ID < b.ID;}// 重新定义小于&#xff0c;因为默认的sort函数调用的操作符是<&#xff0c;所以我…

负数在计算机中如何表示?

取一个负数如-5&#xff0c;其原码就是其绝对值5的原码&#xff0c;但最高位为1&#xff0c;&#xff08;负数最高位为1&#xff0c;正数最高位为0&#xff09;&#xff0c;其反码就是对原码取反&#xff08;最高位不参与取反&#xff09;&#xff0c;补码就是对反码1&#xff…

String中删除空格的7种方法!

字符串&#xff0c;是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。本文我们介绍一个比较常见又容易被忽略的一个操作&#xff0c;那就是移除字符串中的空格。其实&#xff0c;在Java中从字符串中删除空格…

pictureBox1.Image的获得图片路径的三种方法

1.绝对路径: this.pictureBox2.ImageImage.FromFile("D://1.jpg"); 2.相对路径: Application.StartupPath; 可以得到程序根目录 this.pictureBox2.ImageImage.FromFile(Application.StartupPath "//1.gif"); 3.获得网络图片的路径 this.pictureBox2.Imag…

借助datetime和pyttsx3在Python中创建闹钟

Modules used: 使用的模块&#xff1a; To create this script, we will use 3 modules: 要创建此脚本&#xff0c;我们将使用3个模块&#xff1a; datetime 约会时间 time 时间 pyttsx3 pyttsx3 datetime module: datetime is an inbuilt python module which will help us …

ie6 javascript js 缺少标识符总结(转载)

转载http://blog.csdn.net/qingyundys/article/details/6218280 ie6 javascript js 缺少标识符总结1. ie6下&#xff0c;javascript代码中&#xff0c;不能出现保留字符。解决办法就是避免直接使用JS的保留字符。2. IE和Firefox不兼容的地方.属性之间是要用","分隔的…

Unsigned 陷阱

unsigned是整形的一种类型&#xff0c;表示无符号&#xff0c;一般用于unsigned int和unsigned char&#xff0c;如果没有理解unsigned的意义将会在做题中掉入陷阱&#xff0c;下面通过介绍几个例子来说明&#xff1a; 1、 int main() {unsigned int i;for (i 10;i > 0;…

URL 去重的 6 种方案!(附详细代码)

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;URL 去重在我们日常工作中和面试中很常遇到&#xff0c;比如这些&#xff1a;可以看出&#xff0c;包括阿里&#xff0c;网易…