剑指offer——数组中重复的数字(思路不错)
来源:互联网 发布:手机温度测试软件 编辑:程序博客网 时间:2024/06/10 16:59
题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路:
意思是如果有多个重复的话,就返回最早重复的那个?
使用ArrayList的话就很简单了,遍历加入list并执行contains方法,如果有的话就break,并输出该数字。
上面的思路只想到了要用库函数,但是没考虑到复杂性。ArrayList里的contains方法是要遍历底层数组的,复杂度较高。
所以应该用HashSet更好,定位更快,只要O(1)。
巧妙解法的重点在于这个数组长度是n,而数组中元素的值范围是0到n-1。
public boolean duplicate(int numbers[],int length,int [] duplication) { HashSet<Integer> set = new HashSet<>(); int i = 0; for(; i<length; i++){ if(set.contains(numbers[i])) break; set.add(numbers[i]); } if(i==length) return false; duplication[0] = numbers[i]; return true; }
其他思路:
不需要额外的数组或者hash table来保存,题目里写了数组里数字的范围保证在0 ~ n-1之间,所以可以利用现有数组设置标志,当一个数字被访问过后,可以设置对应位上的数 +n,之后再遇到相同的数时,会发现对应位上的数已经大于等于n了,那么直接返回这个数即可。
不需要额外的flag数组,而是把flag数组和原数组结合了。
public boolean duplicate(int numbers[],int length,int [] duplication) { int i = 0; for(; i<length; i++){ int index = numbers[i]; if(index>=length) index -= length; if(numbers[index]>length){ duplication[0] = index; break; } else numbers[index] += length; } if(i==length) return false; return true; }
如果不考虑输出第一个重复的数字,而是输出任意一个重复的数字,offer书里还提供了另一种思路。
阅读全文
0 0
- 剑指offer——数组中重复的数字(思路不错)
- 《剑指offer》——数组中重复的数字
- 《剑指offer》——数组中重复的数字
- 剑指offer——数组中重复的数字
- 剑指offer——数组中重复的数字
- 剑指Offer—50—数组中重复的数字
- 剑指offer—数组中重复的数字
- 剑指offer—数组中重复的数字
- 剑指offer——数组中出现次数超过一半的数字(不错,2 ways)
- 剑指offer--数组中重复的数字
- 《剑指offer》数组中重复的数字
- 剑指offer:数组中重复的数字
- [剑指Offer]数组中重复的数字
- 剑指offer:数组中重复的数字
- 剑指offer 数组中重复的数字
- [剑指offer]数组中重复的数字
- 剑指offer|数组中重复的数字
- 剑指offer-数组中重复的数字
- 清华大学2011年研究生机试-九度OJ1088-剩下的树
- MySQL带DISTINCT关键字的查询
- 无线网络的MAC层
- js中的arguments属性
- 中国工商银行网银不能识别U盾或打不开网页
- 剑指offer——数组中重复的数字(思路不错)
- NIO学习之ByteBuffer理解篇
- VA Alt+G无效
- php照片批量上传,去掉最后一个斜杠之后内容
- 深度学习网
- 【CC2640R2F】利用CCS在macOS下搭建CC2640R2F蓝牙5.0开发环境
- Mybatis中的resultType和resultMap的区别
- jsp:找不到javabean与404
- eclipse黑色主题