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图~

 

posted @ 2017-09-04 10:38  夏天的冬天  阅读(151)  评论(0编辑  收藏  举报