• 刷题41. First Missing Positive


    一、题目说明

    题目是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))<<"
    ";
    	
    	r = {3,4,-1,1};
    	cout<<(2==s.firstMissingPositive(r))<<"
    ";
    	
    	r = {7,8,9,11,12};
    	cout<<(1==s.firstMissingPositive(r))<<"
    ";
    	
    	r = {0,2,2,1,1};
    	cout<<(3==s.firstMissingPositive(r))<<"
    ";
    	
    	r = {1,2,3};
    	cout<<(4==s.firstMissingPositive(r))<<"
    ";
    	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;
    		}
    };
    
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    使用C语言实现面相对对象三大特性
    ResNet王者归来:ImageNet上刷新到80.7!
    VAE生成模型
    DeeplabV3++语义分割训练自制数据集
    CUDA编程入门极简教程
    加载预训练模型修改类别数与不修改类别数
    python使用opencv将Labelme生成的分割图转化成二值化分割图
    pytorch 单卡加载多卡模型module
    【pytorch】常用图像处理与数据增强方法合集(torchvision.transforms)(详细)
    C++11:原子交换函数compare_exchange_weak和compare_exchange_strong
  • 原文地址:https://www.cnblogs.com/siweihz/p/12241085.html
Copyright © 2020-2023  润新知