码迷,mamicode.com
首页 > 其他好文 > 详细

刷题41. First Missing Positive

时间:2020-02-10 09:30:59      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:否则   names   时间复杂度   处理   fir   gpo   cto   while   end   

一、题目说明

题目是41. First Missing Positive,求一个未排序队列中缺失的最小正整数。时间复杂度要求是O(n)。难度是Hard,确实难。

二、我的解答

不考虑时间复杂度,首先对队列进行排序,然后从第一个正数开始,如果不是1就返回1,否则继续查找2....找不到就返回,找到就继续。

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
class Solution{
    public:
        int firstMissingPositive(vector<int>& nums){
            sort(nums.begin(),nums.end());
            int cur = 1;
            
            int start = 0;
            while(start<nums.size() && nums[start]<=0){
                start++;
            }
            
            if(start>= nums.size()){
                return 1;
            }
            if(nums[start] != 1){
                return 1;
            }else{
                for(int t=start;t<nums.size();t++){
                    if(nums[t] == cur){
                        cur++;
                    }
                    if(nums[t]<=cur){
                        continue;
                    }
                }

                if(cur==nums[nums.size()-1]){
                    cur++;
                }
            }
                
            return cur;
        }
};
int main(){
    Solution s;
    vector<int> r;
    
    r = {1,2,0};
    cout<<(3==s.firstMissingPositive(r))<<"\n";
    
    r = {3,4,-1,1};
    cout<<(2==s.firstMissingPositive(r))<<"\n";
    
    r = {7,8,9,11,12};
    cout<<(1==s.firstMissingPositive(r))<<"\n";
    
    r = {0,2,2,1,1};
    cout<<(3==s.firstMissingPositive(r))<<"\n";
    
    r = {1,2,3};
    cout<<(4==s.firstMissingPositive(r))<<"\n";
    return 0;
}

性能如下:

Runtime: 4 ms, faster than 65.35% of C++ online submissions for First Missing Positive.
Memory Usage: 8.6 MB, less than 92.00% of C++ online submissions for First Missing Positive.

三、优化措施

上述实现,排序的时间复杂度一般是O(Nlog(N)),是不满足要求的。对于这个未排序的队列,可以这样处理:从第1个数开始,负数不做处理,如果nums[i] != 1+i,就将nums[i]和 nums[nums[i] - 1]交换,一个循环就可以了。代码如下:

class Solution{
    public:
        int firstMissingPositive(vector<int>& nums){
            int len = nums.size();
            for(int i=0;i<len;){
                if(nums[i]<=len && nums[i]>=1 && nums[i]!=nums[nums[i]-1]){
                    int temp = nums[nums[i] - 1];
                    nums[nums[i] - 1] = nums[i];
                    nums[i] = temp;
                }else{
                    i++;
                }
            }
            
            int i=0;
            while(i<len && i+1==nums[i]){
                i++;
            }
            return i+1;
        }
};

刷题41. First Missing Positive

标签:否则   names   时间复杂度   处理   fir   gpo   cto   while   end   

原文地址:https://www.cnblogs.com/siweihz/p/12241085.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!