在路上的学习者

记录生活,定格瞬间

LeetCode First Missing Positive

思路:

要求找到第一个应该属于[1,nums.size()]范围内的正数却又目前不在的。

从头开始,挨个把各个数换到相应地位置,然后再扫一遍数组,看哪一个数不在它应在的位置上。

时间复杂度O(N),空间复杂度O(1)。

class Solution {
private:
    void change(vector<int> &nums) {
        int n = nums.size();
        for(int i = 0; i < nums.size(); ++i) {
            while(nums[i] != i+1) {
                if(nums[i] < 0 || nums[i] > n || nums[i] == nums[nums[i] - 1]) {
                    break;
                }
                swap(nums[i], nums[nums[i] - 1]);
            }
        }
    }
public:
    int firstMissingPositive(vector<int>& nums) {
        change(nums);
        for(int i = 0; i < nums.size(); ++i) {
            if(nums[i] != i+1) {
                return i + 1;
            }
        }
        return nums.size() + 1;
    }
};

java code:

public class Solution {
    public int firstMissingPositive(int[] nums) {
        if(nums == null || nums.length == 0) return 1;

        for(int i = 0; i < nums.length; ++i) {
            while(nums[i] > 0 && nums[i] <= nums.length && nums[i] != i + 1) {
                if(nums[nums[i] - 1] == nums[i]) break;
                swap(nums, i, nums[i] - 1);
            }
        }
        for(int i = 0; i < nums.length; ++i) {
            if(nums[i] != i + 1) return i + 1;
        }
        return nums.length + 1;
    }

    void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}
阅读更多
个人分类: leetcode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

LeetCode First Missing Positive

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭