剑指offer二刷——数组专题——数组中重复的数字
题目描述
我的想法
最开始想到的是用“字典”,依次记录每个数字出现的次数,这就要遍历数组并且创建字典,感觉空间上占用较大。
# -*- 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)
上述代码官方给的步骤:
设置一个指针i指向开头0,
对于arr[i]进行判断,如果arr[i] == i, 说明下标为i的数据正确的放在了该位置上,让i++
如果arr[i] != i, 说明没有正确放在位置上,那么我们就把arr[i]放在正确的位置上,也就是交换
arr[i] 和arr[arr[i]]。交换之后,如果arr[i] != i, 继续交换。如果交换的过程中,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二刷——数组专题——数组中重复的数字的更多相关文章
- 剑指offer笔记面试题3----数组中重复的数字
题目一:找出数组中重复的数字.在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...
- 剑指offer二刷(精刷)
剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次. ...
- [简单-剑指 Offer 53 - II. 0~n-1中缺失的数字]
[简单-剑指 Offer 53 - II. 0-n-1中缺失的数字] 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一 ...
- 剑指 Offer 53 - II. 0~n-1中缺失的数字 + 二分法
剑指 Offer 53 - II. 0-n-1中缺失的数字 Offer_53 题目详情 java代码 package com.walegarrett.offer; /** * @Author Wale ...
- 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...
- 剑指offer(56)删除链表中重复的节点
一直忘记更新了,把剑指offer更新完吧.... 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-&g ...
- 剑指offer二刷——数组专题——数字在升序数组中出现的次数
题目描述 统计一个数字在升序数组中出现的次数. 我的想法 完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上"升序数组"的这个条件. 题目标签有提醒可以用 ...
- 剑指offer二刷——数组专题——斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1). n<=39 我的想法 斐波那契数列定义:F(0)=0,F(1)=1, ...
- 剑指offer二刷——数组专题——数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
随机推荐
- ixgbe 驱动 为xxx驱动做准备1
网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...
- PF_PACKET抓包mmap
PACKET套接口创建 内核函数packet_create处理PF_PACKET套接口的创建工作.其参数sock->type决定了采用哪一种工作模式,如果参数type为SOCK_PACKET即第 ...
- dp背包 面试题 08.11. 硬币
https://leetcode-cn.com/problems/coin-lcci/ 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需 ...
- gdb调试入门(下)
GDB调试主要包括: 1.查看运行时数据 2.程序错误 3.gdb调试逻辑错误 4.gdb调试段错误 5.core文件调试 一.查看运行时数据 1.print 查看变量值 2.ptype 变量: 查看 ...
- 异步FIFO学习笔记
- Java POI导入word, 带图片
1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...
- python 中 try...finally... 的优雅实现
1. 关于 try.. finally.. 假如上帝用 python 为每一个来到世界的生物编写程序,那么除去中间过程的种种复杂实现,最不可避免的就是要保证每个实例最后都要挂掉.代码可简写如下: tr ...
- 8、Spring Boot任务
1.异步任务 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring ...
- 【VUE】7.Vuex基本使用
1. 安装Vuex npm install vuex --save 2. 导入Vuex包 import Vuex from 'vuex' Vue.use(Vuex) 3. 创建store对象 cons ...
- Idea中如何导入jar包
1.首先在idea左上角找到" File ",然后找到 "Project structure" 2.接着选择 " java ",选择后接着会 ...