题目链接:
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;
}
};
总结:
这是我做的第一个比较容易的困难题。
首先,自己在选择排序上出了问题,令人汗颜,然后在情况考虑上脑子太死板,不够灵活考虑到各种情况,天资愚钝日后要加强练习,不能把情况考虑的想法快速转换成代码,很多变量在不留心的情况下影响到别的判断,导致做题有点烦,希望自己不要拖拉,抓紧时间提升能力。