LeetCode每日一题(题47)

缺失的第一个整数

题目:https://leetcode-cn.com/problems/first-missing-positive/
题目大意:给出一个未排序的数组,找出其中没有出现过的最小整数。
分析:
这道题代码不长,但是却标记的困难足以看出这是一道注重方法和思路的题目。

对于长度为N的数组,假设从1开始每个正整数都出现过,那么最小未出现的正整数是N+1。那么对于这种数组,我们可以将每个元素放到对应下标+1的位置上。
假设1没有出现在这个数组中,那么数组第一个元素nums[0]一定不是1,那么我们就可以直接返回1。如果2没有出现在这个数组中,但是1出现了,那么nums[0]位置上的元素一定是1,但是nums[1]上的元素不是2那么我们可以直接返回2。以此类推,我们把每个元素放置到下标为元素n-1的位置上,然后从头开始遍历,当遍历到这个位置上的元素不满足nums[i]=i+1的条件,那么我们可以确定,第一个没有出现过的最小整数就是i+1

注意交换的时候要采用while而非if,想一想如果采用的是if,假设我们有数组[-1,4,2,1,9,10],当我们遍历到4的时候,把4放置到nums[3]的地方,此时nums[1]的位置上就变成了1,但其实这个1的正确位置应该在nums[0]的地方,如果使用if,交换了一次之后就不会再进行交换了,那么继续向后遍历,于是这个1就留在了错误的位置上。
最后当我们查询未出现元素的时候,发现第一个元素是-1,于是就错误地返回了1。

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

猜你喜欢

转载自blog.csdn.net/qq_33241802/article/details/106981676