LintCode 寻找缺失的数
题目:原题地址
给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。
样例
N = 4
且序列为 [0, 1, 3]
时,缺失的数为2
。
挑战
在数组上原地完成,使用O(1)的额外空间和O(N)的时间。
这题要求在O(n)的时间内,O(1)的空间内完成。
我们可以这样做:
设数组下标从1开始到N结束。
我们可以将数组变成其当前位置的值就是其下标值(如果存在,不存在就将0放入),那么例子中的数组
0,1,3 可以变成 1, 0, 3
数组下标从1开始到3嘛。
这个变换的过程可以在O(n)的时间内完成,交换空间需要使用O(1)的空间
之后再一次从1向后遍历一遍数组,第一次出现不等于其下标值的位置即为所求位置;
代码如下:
public int findMissing(int[] nums) { int tem; for (int i = nums.length; i > 0;) { if (nums[i - 1] == i || nums[i - 1] == 0) { i--; } else { tem = nums[nums[i - 1] - 1]; nums[nums[i - 1] - 1] = nums[i - 1]; nums[i - 1] = tem; } } for (int i = 0; i < nums.length; i++) { if (nums[i] != i + 1) { return i + 1; } } return 0;
最后附上一张AC图~