zoukankan      html  css  js  c++  java
  • #leetcode刷题之路41-缺失的第一个正数

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
    示例 1:
    输入: [1,2,0]
    输出: 3
    示例 2:
    输入: [3,4,-1,1]
    输出: 2
    示例 3:
    输入: [7,8,9,11,12]
    输出: 1

    说明:
    你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

    方法1:这个的话时空复杂度太大,不符合要求的

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int firstMissingPositive(vector<int>& nums) {
        int ans=1;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]<1) continue;
            if(nums[i]==ans) ans++;
        }
        return ans;
    }
    
    int main() {
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }

    方法1:改进的方式为,遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <map>
    using namespace std;
    
    //int firstMissingPositive(vector<int>& nums) {
    //    int ans=1;
    //    sort(nums.begin(),nums.end());
    //    for(int i=0;i<nums.size();i++)
    //    {
    //        if(nums[i]<1) continue;
    //        if(nums[i]==ans) ans++;
    //    }
    //    return ans;
    //}
    
    
    int firstMissingPositive(vector<int>& nums)
    {
        for(int i = 0; i < nums.size();i++)
        {
            if (nums[i] >= 1 && nums[i] <= nums.size() && nums[nums[i] - 1] != nums[i])
            {
                int temp = nums[i];
                nums[i] = nums[temp - 1];
                nums[temp - 1] = temp;
                if (i != nums.size() - 1) i--;
            }
        }
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] != i + 1)
            {
                return i + 1;
            }
        }
        return nums.size() + 1;
    }
    
    
    
    int main() {
        vector<int> nums={3,4,-1,1};
        int ans=firstMissingPositive(nums);
        std::cout << ans << std::endl;
        return 0;
    }
  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/biat/p/10607018.html
Copyright © 2011-2022 走看看