LeetCode第41题:First Missing Positive(Java、C++)详解

Given an unsorted integer array, find the smallest missing positive integer.

Example 1:

Input: [1,2,0]
Output: 3
Example 2:

Input: [3,4,-1,1]
Output: 2
Example 3:

Input: [7,8,9,11,12]
Output: 1

题目解析:
1、乍一看,题目很简单呀,但是限制了时间复杂度,题目就不简单啦,使用排序啥的肯定超时时间复杂度限制啦;
2、思路:
假设数组的大小为n,我们遍历整个数组,如果当前元素i在1-n之间那么就将当前元素和数组第i-1个元素交换。如果当前元素是负数或者大于n那么就不处理。
这样遍历完所有的元素之后,原始数组当中出现在1-n之间的元素都被放在了对应的0~n-1的位置里。再次遍历数组,找到第一个不满足nums[i]==i+1的位置,那么i+1就是最小的未出现的正整数。
解释:
nums[i]!=nums[nums[i]-1]
这句话的意思是:nums[i]表示数组第i个元素,如果是等于3,那么对应位置是不是放在nums[2]上面;
(因不能建立新的数组,那么只能覆盖原有数组,思路是把1放在数组第一个位置 nums[0],2放在第二个位置 nums[1],即需要把 nums[i] 放在 nums[nums[i] - 1]上)
3、一句话就是:把原有数组中值放在相应的位置上,最后遍历一次数组,就找到对应值啦。

C++代码:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        //nums = [1,2,0];
        int n = nums.size();//n = 3;
        for (int i = 0; i < n; ++i) {
            //i = 0;
            //i = 1;
            //i = 2;
            while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
            // 1 >0 ;1 <= 3;1 != 1 false
            // 2 > 0;2 <= 3;2 != 2 false
            // 0 > 0 false
                swap(nums[i], nums[nums[i] - 1]);
            }
        }
        //nums = [1,2,0]
        for (int i = 0; i < n; ++i) {
            //i = 0;
            //i = 1;
            //i = 2;
            if (nums[i] != i + 1) {
                //1 != 1;
                //2 != 2
                //0 != 3 true;
                return i + 1;
                //return 3
            }
        }
        return n + 1;
    }
};

Java代码:

class Solution {
    public int firstMissingPositive(int[] nums) {
        int len = nums.length;
        for(int i = 0;i<len;i++)
        {
            if(nums[i] == i + 1)
            {
                continue;
            }
            while(nums[i] > 0 && nums[i] <= len && nums[nums[i] -1] != nums[i])
            {
                swap(nums[i],nums[nums[i] - 1]);
            }
        }   
        for(int i = 0;i < len;i++)
        {
            if(nums[i] != i + 1)
            {
                return i + 1;
            }
        }
        return len + 1;
    }
    
    public void swap(int a,int b)
    {
        int temp = a;
        a = b;
        b  = temp;
    }
}

性能:
Java同样思路代码,显示超时,调试代码,在while处一直死循环,swap函数交换值,值未交换成功(这个地方需要深究下);
LeetCode第41题:First Missing Positive(Java、C++)详解

总结:C++在性能上还是占优势的,Java调优需要进一步学习!

上一篇:栈应用_计算按运算符优先级分布的算式(代码、分析、汇编)


下一篇:javaweb的包和项目步骤