数组类41--缺失的第一个正数(H)

2019-08-26  本文已影响0人  干LeetCode
image.png

AC代码

class Solution {
    public int firstMissingPositive(int[] nums) {
        if(nums == null || nums.length == 0) {
            return 1;
        }
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] <= 0) {
                continue;
            }
            if(nums[i] > nums.length) {
                nums[i] = -1;
                continue;
            }
            if(nums[i] == i + 1) {
                continue;
            }
            // >0 && <length
            int k = nums[i];
            nums[i] = -1;
            while(k > 0 && k <= nums.length) {
                int tmp = nums[k - 1];
                nums[k - 1] = k;
                if(k != tmp) {
                    k = tmp;
                }else {
                    k = -1;
                }
            }
        }
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] != i + 1) {
                return i + 1;
            }
        }
        return nums.length + 1;
    }
}

精髓
纯智商题,没什么技巧,想出来就做的出来,想不出来就做不出来。
对当前数字进行重新放置位置,比如[3,5,4,1],第一个是3,就把他放到3 - 1即第2个位置,并同时把3这个数的位置置为-1,变成[-1, 5, 3,1],同时tmp值记录下了4,进行同样的处理,4应该放到4 -1即第3个位置。。。如此下去,数组可以变成包含某些正数的数组,第一个下标和数值不一致的就是答案,当然要考虑其他特殊情况,比如全是负数,或者全是同一个数等等。case还是比较多的,容易出错。

上一篇 下一篇

猜你喜欢

热点阅读