数据结构与算法
/*找出数组中的重复数字
*
* 在一个长度为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跳出循环目的便可达到。
感谢大家支持!!!第一次写博客,以后会常来的。个人能力还有待提高,希望大家多多指教。有问题多与我联系!!!

浙公网安备 33010602011771号