zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    SharePoint 2010 世界(一)
    joomla个性定制(五)
    express框架简析&#128049;‍&#127949;
    组件
    日常
    mongo数据库浅析
    vue浅析
    react开发环境
    jsonserver
    关于arraylist.remove的一些小问题。
  • 原文地址:https://www.cnblogs.com/lfri/p/12551325.html
Copyright © 2011-2022 走看看