题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

题目分析与代码

题目比较简单,不过我想写下我的算法改进过程。

我第一眼看到就是打算用额外的数组或者hash记录下次数,然后再判断次数大于1的即为重复的,像这样。

function duplicat(numbers, duplication) {
// write code here
// 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
// 函数返回True/False
const map = {};
let flag = false;
for (let i = 0; i < numbers.length; i++) {
if (!map[numbers[i]]) {
map[numbers[i]] = 1;
} else {
map[numbers[i]]++;
}
}
for (const i in map) {
if (map[i] > 1) {
flag = true;
duplication[0] = i;
break;
}
}
return flag;
}

后来觉得第二个循环明显多次一举,我只需要知道出现次数大于1就行了,不需要知道所有数出现次数,于是有

function duplicate(numbers, duplication) {
const map = {};
let flag = false;
for (let i = 0; i < numbers.length; i++) {
if (!map[numbers[i]]) {
map[numbers[i]] = 1;
} else {
duplication[0] = numbers[i];
flag = true;
break;
}
}
return flag;
}

可是不对呀,题目的条件有个没有利用上呀:一个长度为n的数组里的所有数字都在0到n-1的范围内

说明算法还可以改进。

由于数组里的所有数字都在0到n-1,也就是值也在数组的下标范围里。

我们可以这样做,通俗来讲,就是把数组中的每个值放到对应的下标的位置上。(数归其标)

  1. 把当前序列当成是一个下标和下标对应值是相同的数组;
  2. 遍历数组,判断当前位的值和下标是否相等: 2.1. 若相等,则遍历下一位; 2.2. 若不等,则将当前位置i上的元素和a[i]位置上的元素比较:若它们相等,则成功,即找到了重复的值!若不等,则将它们两交换。换完之后a[i]位置上的值和它的下标是对应的,但i位置上的元素和下标并不一定对应;重复2.2的操作,直到当前位置i的值也为i,将i向后移一位,再重复2.

这个也是剑指上的做法,这种不需要额外空间,时间复杂度为O(n)

// 第一种
function duplicate(numbers, duplication) {
for (let i = 0; i < numbers.length; i++) {
while (i !== numbers[i]) {
if (numbers[i] === numbers[numbers[i]]) {
duplication[0] = numbers[i];
return true;
}
[numbers[i], numbers[numbers[i]]] = [numbers[numbers[i]], numbers[i]]; // 交换
}
}
return false;
}

对了,还可以排序后,比较前后数字是否相同来做,不过这种方法时间复杂度不行,故舍去。

除此外,在牛客上还有种做法:

题目里写了数组里数字的范围保证在0 ~ n-1 之间,所以可以利用现有数组设置标志,当一个数字被访问过后,可以设置对应位上的数 + n,之后再遇到相同的数时,会发现对应位上的数已经大于等于n了,那么直接返回这个数即可。

// 第二种
function duplicate2(numbers, duplication) {
for (let i = 0; i < numbers.length; i++) {
let index = numbers[i];
if (index >= numbers.length) {
index -= numbers.length;
}
if (numbers[index] >= numbers.length) {
duplication[0] = index;
return true;
}
numbers[index] = numbers[index] + numbers.length;
}
return false;
}

剑指offer(50)数组中重复的数字的更多相关文章

  1. 剑指Offer 50. 数组中重复的数字 (数组)

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  2. [剑指Offer] 50.数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

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

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

  4. 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...

  5. 5.1 剑指 Offer 03. 数组中重复的数字

    类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...

  6. 【剑指Offer】数组中重复的数字 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 Set 快慢指针 日期 题目地址:https://leetcod ...

  7. Go语言实现:【剑指offer】数组中重复的数字

    该题目来源于牛客网<剑指offer>专题. 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组 ...

  8. (python)剑指Offer:数组中重复的数字

    问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...

  9. 剑指offer:数组中重复的数字

    题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度 ...

  10. 【剑指offer】数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

随机推荐

  1. 最大团&优化

    貌似咕了三个半月了(gym101915里一道),今天又遇到一道(cf1105E),就学了学惹. 最大团定义:图上取尽可能多的点,这些点构成一个完全图. 最大独立集:图上取尽可能多的点,任意两点间不连接 ...

  2. spring-boot(三) HowTo

    Spring Boot How To 1. 简介 本章节将回答一些常见的"我该怎么做"类型的问题,这些问题在我们使用spring Boot时经常遇到.这绝不是一个详尽的列表,但它覆 ...

  3. laravel的csrf token 的了解及使用

    之前在项目中因为没有弄清楚csrf token的使用,导致发请求的话,一直请求失败,今天就一起来看一下csrf的一些东西. 1.Cross-site request forgery 跨站请求伪造,也被 ...

  4. windows 安装 Apache、php、mysql及其配置(转载)

    此文包括的注意内容:软件版本及下载地址Apache2.4的配置和安装php7.0的配置mysql5.5的安装常见问题及解决方法1.软件版本Windows server 2008 r2+ 64位Apac ...

  5. 9 ArcGIS Server 性能优化

    1.系统性能影响因子 地图.服务类型.数据源.客户端技术.CPU.数据结构.网络.内存.存储.部署.架构.服务接口.SDE等. 2.ArcGIS Server性能优化 数据结构与数据源:数据结构(矢量 ...

  6. Express中间件的原理及实现

    在Node开发中免不了要使用框架,比如express.koa.koa2拿使用的最多的express来举例子开发中肯定会用到很多类似于下面的这种代码 var express = require('exp ...

  7. 请大神留言:使用static方法和从Spring IOC 容器里面取出的方法有什么区别????

    类的静态方法,不用new出对象,因为它在类的初始化阶段加载到jvm内存的. 而spring容器,是在启动服务的时候,new出容器所管理的对象. 本质区别就是一个在堆中产生了对象,一个没产生对象只在方法 ...

  8. (二)juc线程高级特性——CountDownLatch / Callable / Lock

    5. CountDownLatch 闭锁 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能. CountDownLatch 一个同步辅助类, ...

  9. 使用moment.js结合filter过滤器格式化时间

    <td>{{item.ctime | timeFormat('yyyy-MM-dd')}}</td> //pattern = "" 形参的默认值,如果传过来 ...

  10. ivew定制主题 less ^3.0 时报错 .bezierEasingMixin(); Inline JavaScript is not enabled. Is it set in your options?

    按照 ivew 提供的方法定制主题,创建一个 less 文件,在其中覆盖变量,再在 main.js 中引入.戳这里 出现报错: 问题貌似是在于 less 版本...两种解决方法: 1.打开项目pack ...