缺失的第一个正数(思维)

题目:https://leetcode-cn.com/problems/first-missing-positive/
参考:https://leetcode-cn.com/problems/first-missing-positive/solution/que-shi-de-di-yi-ge-zheng-shu-by-leetcode/
参考2:https://leetcode-cn.com/problems/first-missing-positive/solution/tong-pai-xu-python-dai-ma-by-liweiwei1419/
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
官方提交orz

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        /*
        *给定一个未排序的整数数组,找出其中没有出现的
        *最小的正整数。要求时间复杂度O(n),空间复杂度
        *O(1).
        */
        int n = nums.size();
        int pos = -1;
        for(int i = 0;i < n;i++) {
            if(nums[i] == 1) {
                pos = i;
                break;
            }
        }
        if(pos == -1) return 1;
        //确保有1的前提下,将非法数变为1
        for(int i = 0;i < n;i++) {
            if(nums[i] <= 0 || nums[i] > n) nums[i] = 1;
        }
        //nums[i] < 0表示i存在
        for(int i = 0;i < n;i++) {
            int x = nums[i];
            if(x < 0) x = -x;
            if(nums[x-1] > 0) nums[x-1] = -nums[x-1];
        }
        for(int i = 0;i < n;i++) {
            if(nums[i] > 0) return i+1;
        }
        return n+1;
    }
};

方法2:利用抽屉原理

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        /*
        *给定一个未排序的整数数组,找出其中没有出现的
        *最小的正整数。要求时间复杂度O(n),空间复杂度
        *O(1).
        */
        int n = nums.size(),pos;
        for(int i = 0;i < n;i++) {
            while(nums[i] != i+1) {
                if(nums[i] <= 0 || nums[i] > n ||nums[nums[i]-1] == nums[i])
                    break;
                pos = nums[i]-1;
                swap(nums[i],nums[pos]);//将nums[i]放到原本的地方
            }
        }
        for(int i = 0;i < n;i++) {
            if(nums[i] != i+1)
                return i+1;
        }
        return n+1;
    }
};
发布了71 篇原创文章 · 获赞 1 · 访问量 2784

猜你喜欢

转载自blog.csdn.net/weixin_43918473/article/details/104342270
今日推荐