一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)
数组中重复的数字
在上一篇博客中《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素。
然后我们在博客用最复杂的方式学会数组(Python实现动态数组)这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组。
今天我们介绍一下另一道来自《剑指Offer》的关于数组的面试题——不修改数组找出重复的数字。
不修改数组找出重复的数字
题目二:不修改数组找出重复的数字
给定一个长度为 n+1 的数组里的所有数字都在 0∼n 的范围内,所以数组中至少有一个数字是重复的。
请找出数组中任意一个重复的数字,但不能修改输入的数组。
样例:
给定长度为8的数组 nums = [2, 3, 5, 4,3, 2, 6,7]
那么输出重复的数字2或者3
思路
首先我们得关注到,题目要求是:不修改数组,然后还是 返回任意一个重复的数字
。所以解题思路相比而言变少了:
哈希表:跟上一题一样,本题也可以创建一个哈希表,如果原数组的每个数字第一次出现,就把他放到哈希表中去,即原数组大小为m的数字应该放到哈希表下标为m的位置上。空间复杂度是 \(O(n)\) 。
二分法:那么有没有不用空间复杂度\(O(n)\) 的算法。假设没有重复数,那么 1~n 之间,每个数都只能出现一次。而题目中,这个数组至少有一个数字重复,即出现的次数大于1。
利用二分的思想:把 1~n 的数字从中间数字m开始分为两部分,前一半为 1~ m,后面一半为 m+1 ~n,如果 1~m 中的数字在数组中出现的次数大于m,那么这一半必定有重复的数字;否则,那么另一部分必定含有重复数字。接着我们,继续对含有重复数字的区间一分为二,直到找到重复的数字。
思路一:哈希表
def find_duplicated_num(nums):
"""hash_map"""
hash_map = dict()
for i, val in enumerate(nums):
if val in hash_map:
return val
hash_map[val] = i
return False
思路二:二分法
def reduce_inter(nums2, left, right):
""" """
mid = (left + right) // 2
count = 0
length = len(nums2)
for i in range(length):
if (nums2[i] >= left) and (nums2[i] <= mid):
count += 1
if count > mid - left + 1:
return left, mid
else:
return mid+1, right
def find_duplicated_num2(nums2):
left, right = 1, len(nums2) - 1
while left != right:
left, right = reduce_inter(nums2, left, right)
return left
测试
nums = [2, 3, 5, 4, 3, 2, 6, 7]
# nums_n = [5, 4, 3, 2, 6, 7]
print("思路一测试结果: ", find_duplicated_num(nums))
print("思路二测试结果: ", find_duplicated_num2(nums))
结果
思路一测试结果: 3
思路二测试结果: 3
总结
其实,这种算法不能保证找出所有重复的数字,比如不能找出[2, 3, 5, 4, 3, 2, 6, 7]重复数字2。
一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)的更多相关文章
- 【Java】 剑指offer(2) 不修改数组找出重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少 ...
- 《剑指offer》第三_二题(不修改数组找出重复的数字)
// 面试题3(二):不修改数组找出重复的数字 // 题目:在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至 // 少有一个数字是重复的.请找出数组中任意一个重复的数字,但不能修改 ...
- 【Offer】[3-2] 【不修改数组找出重复的数字】
题目描述 思路分析 Java代码 代码链接 题目描述 在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的. 请找出数组中任意一个重复的数字,但不能修改输入的数组. ...
- Acwing 14. 不修改数组找出重复的数字
题目地址 https://www.acwing.com/problem/content/description/15/ 来源:剑指Offer 给定一个长度为 n+1n+1 的数组nums,数组中所有 ...
- 【剑指 Offer】03.1.不修改数组找出重复的数字
找出数组中重复的数字. 在一个长度为 n + 1 的数组 nums 里的所有数字都在 1-n 的范围内.所以数组中至少有一个是重复的.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, ...
- 【剑指Offer】把数组排成最小的数 解题报告(Python)
[剑指Offer]把数组排成最小的数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 用js刷剑指offer(顺时针打印数组)
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
- 用js刷剑指offer(二维数组中的查找)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 力扣 - 剑指 Offer 57. 和为s的两个数字
题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...
随机推荐
- FIT文件CRC校验
校验FIT文件CRC代码做个记录,分为两步先校验头部然后再校验整个FIT文件.校验头部不是必需的看个人需要吧.为了偷懒使用Okio库,还有计算CRC的时候用的Garmin的FitSDK. public ...
- win10下,打开oracle时出现 oracle initialization or shutdown in process 错误 的解决办法
解决方法: 1)在dos窗口下输入:sqlplus /nolog 2)SQL>connect sys/sys as sysdba 提示:已连接. 3)SQL>shutdown normal ...
- Angular 文件上传、下载
1. 文件上传 本地可同时选择多个文件 将本地所选择的文件列出来 单个文件上传至服务器: 删除本地选择的文件 样式使用了bootstrap的样式 1. html - file.component.ht ...
- Ionic2优于Ionic1的6个理由
经历了一个从0到有的app的开发,我已经很熟悉Ionic1了,在此期间我曾发现过Ionic1的一些bug,和一些不合理的地方(根基版本 不同,后续我会陆续发表这些文章),我甚至在此期间对Ionic1进 ...
- Django学习之文件上传
就这么六步! 一.settings配置文件中配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').replace ...
- Spring Cloud Config Server 节点迁移引起的问题,请格外注意这一点!
前言: 虽然强烈推荐选择使用国内开源的配置中心,如携程开源的 Apollo 配置中心.阿里开源的 Nacos 注册&配置中心. 但实际架构选型时,根据实际项目规模.业务复杂性等因素,有的项目还 ...
- 小程序webview调用微信扫一扫的“曲折”思路
自上一篇遇到webview中没有返回按钮之后,虽然跳出坑了.解决方案:<小程序webview跳转页面后没有返回按钮完美解决方案> 但是,小程序踩坑之路并没有结束.在公众号网页中通过配置AP ...
- spring boot使用vue+vue-router构建单页面应用
spring boot http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ vue https: ...
- 直通BAT面试题库锦集
01 python面试题(汇总) 02 面向对象 03 网络和并发编程 04 模块 05 设计模式 06 前端 07 Django框架 08 Flask 09 tornado 10 DB
- Embarrassment
I don't know what I did wrong, why do I take care of me? I did something wrong before, your parents ...