算法(2) Find All Numbers Disappeared in an Array

题目:整数数组满足1<=a[i]<=n(n是数组的长度),某些元素出现一次,某些元素出现两次,在数组a[i]中找到【1,n】区间中未出现的数字。比如输入【4,3,2,7,8,2,3,1】,输出【5,6】。时间复杂度要求是O(n),空间复杂度要求O(1)

思路:看许多网友说用set数据结构去做,这就违反了空间复杂度的要求,所以排序还是要本地做的。遍历数组,把这个数字放到它该待的地方:比如a[0]=4,那么我们就把4放到a[3]处,然后把a[3]处的7放到a[6]处,把a[6]处3放在a[2]处,把a[2]处的2放在a[1]处,晕了吧

这样做:

step1: ,3,2,,8,2,3,1

step2:,3,2,4,8,2,,1

step3:,3,,4,8,2,7,1

step4:,3,4,8,2,7,1 

step4.1:此时想着交换3和3,但是发现重了,那么3还是待在原位吧,我们就进一步考察a[1]这个位置发现a[1]=2,2就是应该待在这里,不需要调整;接着查看a[2]位置,a[2]=3, 不需要调整;a[3]=4,不需要调整;a[4]=8,需要调整,去看8应该呆的a[7]位置=1需要交换:

step5:3,2,3,4,,2,7,

step6:,2,3,4,,2,7,8

step6.1:此时想着交换3和a[2]位置的3,但是a[2]=3=3,所以这里也就不做置换咯,直接考察下一个位置a[5]=2;

step6.2:想着交换2和a[1]位置的2,但是a[1] = 2 = 2,所以不需要交换咯;

step6.3:接着下一个位置,a[6] = 7,是7该待的地儿,接着下一个位置;a[8] = 7,也是8该待的地儿;

遍历一圈的数组是:12343278

然后再遍历一圈,找到a[i] != i+1的数组项,就能找到缺省的指i+1咯

 

答案

https://github.com/honpey/codebox/blob/master/leetcode/array/p448.cpp

相关

1<= a[i] <= n; 1至n的数字缺少一个,找出缺少的数字;

总结

特殊的数组可能会出现O(n)的排序方法

 

posted @ 2017-04-23 11:14  honpey  阅读(161)  评论(0编辑  收藏  举报