41. 缺失的第一个正数的简单思路

题目链接:

https://leetcode-cn.com/problems/first-missing-positive/description/

题目描述:

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

思路:

一开始以为比较简单,没有把负数去掉的情况考虑进去,结果靠一次次数据把我敲醒。

后来整体的思路是:先选择排序,再考虑正整数的数据,考虑正整数数据没有和只有一个的情况,再考虑最小整数出现在正整数中间位置的情况,最后考虑最小整数比最大的数组整数都大的情况,情况考虑的比较多,得考虑到比较刁钻得数据。

选择排序:

int k,f,m,n=0;
        if(nums.size()==0) return 1;
        for(int i=0;i<nums.size()-1;i++){
            k=i;
            for(int j=i+1;j<nums.size();j++)
                if(nums[k]>nums[j]) k=j;
                f=nums[k];
                nums[k]=nums[i];
                nums[i]=f;
        }

考虑正整数在数组中的位置,如果都是正整数则重置为零:

for(;n<nums.size();n++){
                
            if(nums[n]<=0&&nums[n+1]>0) {
                n++;
                break;
            }
        }
        if(nums[0]>=0) n=0;

最后是考虑一个和多个排序好的正整数的情况:

f(nums.size()-n==1) {
            if(nums[n]==1) return 2;
            else return 1;
        }
        if(nums[n]>1) return 1;
        for(m=n;m<nums.size();m++)
            if(nums[m+1]-nums[m]>1) return nums[m]+1;
        return nums[m-1]+1;

    }

源代码:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int k,f,m,n=0;
        if(nums.size()==0) return 1;
        for(int i=0;i<nums.size()-1;i++){
            k=i;
            for(int j=i+1;j<nums.size();j++)
                if(nums[k]>nums[j]) k=j;
                f=nums[k];
                nums[k]=nums[i];
                nums[i]=f;
        }
       
        for(;n<nums.size();n++){
                
            if(nums[n]<=0&&nums[n+1]>0) {
                n++;
                break;
            }
        }
        if(nums[0]>=0) n=0;
        if(nums.size()-n==1) {
            if(nums[n]==1) return 2;
            else return 1;
        }
        if(nums[n]>1) return 1;
        for(m=n;m<nums.size();m++)
            if(nums[m+1]-nums[m]>1) return nums[m]+1;
        return nums[m-1]+1;

    }
};

总结:

这是我做的第一个比较容易的困难题。

首先,自己在选择排序上出了问题,令人汗颜,然后在情况考虑上脑子太死板,不够灵活考虑到各种情况,天资愚钝日后要加强练习,不能把情况考虑的想法快速转换成代码,很多变量在不留心的情况下影响到别的判断,导致做题有点烦,希望自己不要拖拉,抓紧时间提升能力。

猜你喜欢

转载自blog.csdn.net/thunderforrain/article/details/81187969