关闭

LeetCode First Missing Positive

187人阅读 评论(0) 收藏 举报
分类:

思路:

要求找到第一个应该属于[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;
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    Always Be Coding
    个人资料
    • 访问:810373次
    • 积分:10392
    • 等级:
    • 排名:第1599名
    • 原创:445篇
    • 转载:54篇
    • 译文:0篇
    • 评论:114条
    文章分类