leetcode41-缺失的第一个正数

题目:给定一个未排序的整数数组,找出其中没有出现的最小的正整数。要求时间复杂度O(n)、空间复杂度O(1)

分析:

首先想到用个vis数组,数组开多大呢,需要根据数的范围(其实只需要开n的大小,因为我们不需要关心小于1和大于n的数)

但是这样需要额外的空间,不符合题意。于是想着能不能将原数组当作vis数组用,用取反(负数)作为“出现过”的标记。

整理一下:

1. 遍历一篇看是否有1,没有直接return 1

2. 将在[1, n]之外的置为1

3. 遍历,将每个值(取绝对值,因为可以被取负了)作为索引的位置取反(如果之前是正数的话)

4. 遍历一遍,第一个非负数的索引即答案。

class Solution {
public:
    int firstMissingPositive(vector<int>& a) {
        int n = a.size();
        int flag = false;
        for(int i = 0;i < n;i++)
            if(a[i] == 1)
            {
                flag = true;
                break;
            }

        if(!flag)  return 1;


        for(int i = 0;i < n;i++)  // 小于1,大于n的都改成1
        {
            if(a[i] <= 0)  a[i] = 1;
            if(a[i] > n)  a[i] = 1;
        }

        for(int i = 0;i < n;i++)
        {
            int index = a[i]-1;
            if(a[i] < 0) index = -a[i]-1; 
            if(a[index] > 0)
                a[index] = - a[index];
        }

        int ans = n+1;
        for(int i = 0;i < n;i++)
            if(a[i] > 0)
            {
                ans = i+1;
                break;
            }

        return ans;
    }
};

 

参考链接:https://leetcode-cn.com/problems/first-missing-positive/solution/que-shi-de-di-yi-ge-zheng-shu-by-leetcode/

posted @ 2020-03-23 12:02  Rogn  阅读(86)  评论(0编辑  收藏