1、数组中重复的数字
题目描述
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
Input:
{2, 3, 1, 0, 2, 5}
Output:
2
解题思路
1)任意一个重复的数字,所以当查找到第一个重复的时候就可以return
2)如果要求时间复杂度O(N),空间复杂度O(1)。则不能使用排序算法。如果没有要求,可以先进行排序,扫描排序之后的数组即可。
3)解决思路一:采用将值为i的元素调整到第i个位置,如果发现位置上面的元素已经有对应数值了,则发现有重复。先进行交换,将所有数字放入对应的位置,交换前面加上一个判断,如果你发现对应位置的数字是对的,然后你又发现一个这样的数字,那这个数字就是重复的一个数字。如果发现多个,那将重复的数字放在数组中进行保存。
解决思路二:哈希表。从头到尾扫描数组,每扫描到一个数字,判断该数字是否在哈希表中,如果该哈希表还没有这个数字,那么加入哈希表,如果已经存在,则返回该数字;时间复杂度:O(n),空间复杂度:O(n)
解决思路三:排序,再遍历
交换数字,按位置比较。
- public class repeatNum3 {
- /**
- * @param ycy
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int[] num= {2,3,1,0,2,5};
- int repeat = 0;
- int j = 0;
- if(num == null || num.length<=0){
- System.out.println("不存在重复的数据");
- }
- System.out.println("数据长度"+num.length);
- for(int i=0;i<num.length;i++){
- while(num[i] != i){
- if(num[i] == num[num[i]]){
- repeat = num[i];
- System.out.println("存在重复的数据"+repeat);
- return;
- }
- swap(num,i,num[i]);
- }
- }
- return;
- }
- public static void swap(int[] num,int i,int j){
- int t = num[i];
- num[i] = num[j];
- num[j] = t;
- }
- }
各种排序算法比较
各种常用排序算法 |
||||||||
类别 |
排序方法 |
时间复杂度 |
空间复杂度 |
稳定性 |
复杂性 |
特点 |
||
最好 |
平均 |
最坏 |
辅助存储 |
|
简单 |
|
||
插入 排序 |