题目描述

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

我的想法

最开始想到的是用“字典”,依次记录每个数字出现的次数,这就要遍历数组并且创建字典,感觉空间上占用较大。

# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
dic={}
for i in numbers:
if i in dic:
duplication[0]=i
return True
else: dic[i]=1
return False

  时间复杂度o(n),空间复杂度o(n)

然后想到用数组代替字典,因为数组内所有数字都在0到n-1的范围内,那么我可以创建一个大小为n的数组a,初始值都为0,利用数组下标记录a[i]是否为0。如果a[i]==0,那么说明该数字是第一次遍历到,令a[i]=1;如果a[i]==1,那么说明该数字是第二次遍历到,该数字重复,令duplication[0]=i,返回True;如果遍历完全后没有return False,那么就return True。

# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
if len(numbers)==0: return False
a=[0]*len(numbers)
for i in numbers:
if not a[i]: a[i]=1
else:
duplication[0]=i
return True
return False

  时间复杂度o(n),空间复杂度o(n)

然后我觉得以上两种方法,空间复杂度都为o(n),应该还有空间复杂度更小的解法。但我想不出来了。

官方解法

也是利用数组下标的性质,但是不是新建一个数组,而是利用指针。i 从0的位置开始,一定要找到每个 i 对应的数字,即numbers[i]=i,才能继续下一个,如果交换过程中发现已经是numbers[i]=i,那么当前要交换的数字就是重复的数字。

 1 # -*- coding:utf-8 -*-
2 class Solution:
3 # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
4 # 函数返回True/False
5 def duplicate(self, numbers, duplication):
6 # write code here
7 if not numbers or len(numbers)==0:return False
8 for i in range(len(numbers)):
9 while i!=numbers[i]:
10 if numbers[i]==numbers[numbers[i]]:
11 duplication[0]=numbers[i]
12 return True
13 # swap
14 # numbers[i],numbers[numbers[i]] = numbers[numbers[i]],numbers[i]不可行
15 tmp=numbers[i]
16 numbers[i]=numbers[numbers[i]]
17 numbers[tmp]=tmp
18 return False

   时间复杂度o(n),空间复杂度o(1)

上述代码官方给的步骤:

    1. 设置一个指针i指向开头0,

    2. 对于arr[i]进行判断,如果arr[i] == i, 说明下标为i的数据正确的放在了该位置上,让i++

    3. 如果arr[i] != i, 说明没有正确放在位置上,那么我们就把arr[i]放在正确的位置上,也就是交换
      arr[i] 和arr[arr[i]]。交换之后,如果arr[i] != i, 继续交换。

    4. 如果交换的过程中,arr[i] == arr[arr[i]],说明遇到了重复值,返回即可。
      如下图:

                       
 

使用内置函数的解法

使用set函数可以删除无序数组中重复的数字。 https://www.runoob.com/python/python-func-set.html

使用 collections.Counter.most_common(1) 可以找到数组中重复最多的数字。https://blog.csdn.net/qwe1257/article/details/83272340

 1 # -*- coding:utf-8 -*-\
2 from collections import Counter
3 class Solution:
4 # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
5 # 函数返回True/False
6 def duplicate(self, numbers, duplication):
7 # write code here
8 if len(numbers)==0 or not numbers:return False
9 if len(numbers)==len(set(numbers)):return False
10 duplication[0]=Counter(numbers).most_common(1)[0][0]
11 return True
 
 
 
 

剑指offer二刷——数组专题——数组中重复的数字的更多相关文章

  1. 剑指offer笔记面试题3----数组中重复的数字

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

  2. 剑指offer二刷(精刷)

    剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次. ...

  3. [简单-剑指 Offer 53 - II. 0~n-1中缺失的数字]

    [简单-剑指 Offer 53 - II. 0-n-1中缺失的数字] 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一 ...

  4. 剑指 Offer 53 - II. 0~n-1中缺失的数字 + 二分法

    剑指 Offer 53 - II. 0-n-1中缺失的数字 Offer_53 题目详情 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  5. 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字

    题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...

  6. 剑指offer(56)删除链表中重复的节点

    一直忘记更新了,把剑指offer更新完吧.... 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-&g ...

  7. 剑指offer二刷——数组专题——数字在升序数组中出现的次数

    题目描述 统计一个数字在升序数组中出现的次数. 我的想法 完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上"升序数组"的这个条件. 题目标签有提醒可以用 ...

  8. 剑指offer二刷——数组专题——斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1). n<=39 我的想法 斐波那契数列定义:F(0)=0,F(1)=1, ...

  9. 剑指offer二刷——数组专题——数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

随机推荐

  1. CVE-2020-0769逆向分析

    受影响版本: 系统 版本 Microsoft Windows 10 Windows 10 1607 Windows 10 1709 Windows 10 1803 Windows 10 1809 Wi ...

  2. 某C++神作,就100句话而已

    假设p是指针,当delete p;时,后面一定要p=NULL将p指向空 cin cout cerr 都是iostream类型的对象.cout<<"hello world" ...

  3. 解密Cookie,这一篇就够了

    一.Cookie介绍 因为HTTP协议是无状态的,每次请求都是独立的,服务器端无法判断两次请求是否来自同一个用户,进而也就无法判断用户的登录状态,也不知道用户上一次做了什么.所以Cookie就是用来绕 ...

  4. appium 数据参数化 登录模块

    下面是我最近学习的PYTHON的登录代码: class test(object): def getdic(self): d = {'username': '13', 'password': '1111 ...

  5. Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句)

    Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句) 1.冗余的if/else或switch ​ 有没有朋友写过以下的代码结构,大量的if/esle判断,来选择 ...

  6. Nacos配置中心源码分析

    1.使用 compile 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2.2.3.RELEASE' spring: app ...

  7. CSRF和XSS的区别

    XSS是啥? xss就是跨域脚本攻击 什么是跨域脚本攻击? 就是在正常的输入框中(如:用户名修改等)插入script恶意代码,从而在你遍历数据的时候加载该js文件, 获取你的cookie或sessio ...

  8. FL Studio中如何进行工具栏编辑

    菜单工具栏是我们使用FL Studio时经常需要使用的一个功能,那么,除了软件默认的菜单工具栏,我们应该如何编辑菜单工具栏呢? 图1:工具栏编辑 想要编辑更改默认菜单栏,我们只需要鼠标右键单击菜单工具 ...

  9. 人人都能学会系列之ThreadLocal

    1.概览 本文我们来看下java.lang包中的ThreadLocal,它赋予我们给每个线程存储自己数据的能力. 2.ThreadLocal API ThreadLocal允许我们存储的数据只能被特定 ...

  10. YoyoGo微服务框架入门系列-基本概念

    前言 Github开源:github.com/yoyofx/yoyogo 还请多多Star 之前简单介绍了YoyoGo微服务框架的基本内容,接下来了解下框架中的基本概念. 从一个简单Web服务Demo ...