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;
    }
  • 相关阅读:
    一个空类会生成哪些默认函数
    What is VMR(Video Mixing Render)From MSDN
    DirectX backface culling(背面剔除)
    D3DPOOL(资源池)
    两道概率题供大家周末把玩
    空间两点间的距离
    n != n, n == n
    C++默认参数
    D3DPT_TRIANGLELIST与D3DPT_TRIANGLESTRIP
    D3D中的设备丢失
  • 原文地址:https://www.cnblogs.com/biat/p/10607018.html
Copyright © 2011-2022 走看看