数据结构与算法

/*找出数组中的重复数字
*
* 在一个长度为n的数组里的所有数字都在0—n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复了
* 也不知道数字重复了几次请找出数组中任意一个重复的数字
* 例如:[2,3,1,0,2,5,3]
* 那么对应的重复的数字是2或者3

*返回{2,3}
*/

思考:对于此题当然有多重解法,会用排序然后再进行查找,但这样时间复杂度至少是O(nLogn)

这当然不是我们希望看到的,当然也可以使用Hash表 但是这无疑是用空间换取了时间,我们希望有更简单的做法。

 

分析:可以利用一维数组的巧妙的特性加以解决我们可以扫描数组,扫描到下标为为i的数字时比较这个数字(m)是不是等于i如果是则比较,如果不是

两个数字进行交换,将数字放到真正属于它的位置。

Java代码实现

public static Collection<Integer> Solution(int[] num) {
int temp = 0;
ArrayList<Integer> numbers=new ArrayList<Integer>();
if (num.length==0||num==null) {
return null;
}
for (int i = 0; i < num.length; ++i) {
while (num[i]!=i) {
if (num[i]!=num[num[i]]) {
temp=num[i];
num[i]=num[temp];
num[temp]=temp;
}else {
numbers.add(num[i]);
break;//跳出当前循环 找
}
}
}
return numbers;
}

 

这样便可以达到我们的目的 不占用辅助空间同时算法的时间复杂度为o(n)让我们试分析前几次运行的结果

在进行第一次排序之后我们可以得到数组 {1,3,2,0,2,5,3}我们可以注意到此时交换 的数字为第一位的2和第三位的1

之后继续进行循环便可得到{3,1,2,0,2,5,3}直到数组改变为{0,1,2,3,2,5,3}此时内循环便执行结束,将数字2加入到list数组中

break跳出循环目的便可达到。

感谢大家支持!!!第一次写博客,以后会常来的。个人能力还有待提高,希望大家多多指教。有问题多与我联系!!!

 

posted @ 2018-03-16 22:10  倾城之泪  阅读(130)  评论(0)    收藏  举报