03数组中重复的数字
题目描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例1:
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2或3
解决方法
- 时间和空间不作要求 - 排序法
排序完后直接扫描原数组,重复则弹出
- 时间要求为O(1),空间不做要求 - 哈希法
扫描数组加入HashMap中,如果已存在则弹出
public static int findRepeatNumber(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<Integer, Integer>();
for(int a:nums){
if(map.get(a)!=null){
return a;
}
map.put(a,1);
}
return 0;
}
- 空间和时间都要求O(1) - 二分查找
要求1~n中查找数字,则可使用多次扫描数组来查找重复的数字,使用二分法来扫描数组。
例如{2,3,5,4,3,1,6,7}中,可以将1-7分成两段,扫描1-4数字的出现个数,5-7的数字出现个数,1-4应出现4次,但扫描得到5次说明重复数字在1-4中。
再次将1-4分开,分成1-2和3-4,3-4扫描出现3次应扫描两次,说明在3-4中
扫描3和4,发现3重复,则返回3