剑指offer刷题个人总结(一)

面试题3:数组中的重复数字

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

一、自己的作答情况

是否有思路:有,解法为使用HashMap,时间O(n),空间O(n)。

是否有改进思路:否。

二、官方解答

1. 排序

将数组排好序后,从头到尾扫描,通过比较相邻元素,找到重复数字。

时间O(nlogn),空间O(1)。

2. 哈希表

遍历数组,在哈希表中查询遍历到的数字。如果不存在就加入哈希表;如果存在就找到了重复数字。

时间O(n),空间O(n)。

3. 一个萝卜一个坑

题目关键信息:在一个长度为n的数组里的所有数字都在0~n-1的范围内。

不存在重复的时候是一个萝卜一个坑。当存在重复的时候,萝卜要找到自己的坑。当萝卜找到自己的坑的时候,先看坑里萝卜是不是也属于这个坑。如果坑里的萝卜也属于这个坑,那么就找到了重复的萝卜。如果坑里的萝卜不属于这个坑,就让它腾位置。里层循环的条件是,判断当前的萝卜是不是在自己的坑里。外层是整个数组的遍历。

时间O(n),因为里层循环是O(1)。空间O(1)。

三、扩展题:不修改数组找出重复的数字

在一个长度为n+1的数组中的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。在不修改输入数组的情况下找出数组中任意一个重复数字。例如输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},则对应输出的是2或者3。

虽然看懂了书中的思路,但是不能深入理解...等想明白再来补充...

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值