目的:
旨在記錄在Leedcode網上刷題的過程,記錄心得。
題目:
給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
提示: 你的算法的時間複雜度應爲O(n),並且只能使用常數級別的額外空間。
思路:
last:保存遍歷到的符合條件的最大範圍
思路:
先將數組排好序;
依次遍歷數組元素,處理符合[1,n]範圍內的元素。
考慮到重複的元素,使用lastnum來保存上一個遍歷的元素跟當前元素做比較,若2者相等,則跳過。
代碼:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int nsize = nums.size();
if (nsize<1) return 1;
sort(nums.begin(),nums.end());
int n = nums[nsize-1],last = 0,res = -1,lastnum = nums[0];
bool flag = false;//標記是否存在[1,n]之間的元素
for(int ni=0;ni<nsize;ni++){
if(ni!=0&&lastnum==nums[ni]) continue;//排除重複的元素
if(1<=nums[ni]&&nums[ni]<=n){
if(last==0)
if(nums[ni]>1){
res = 1;
flag = true;
break;
}
else last = nums[ni];
else
{
if(last+1==nums[ni]) last++;//保存遍歷到的符合條件的最大範圍
else
{
res = last+1;
flag = true;
break;
}
}
flag = true;
}
if(ni>0) lastnum= nums[ni];//保存上一個元素
}
if(!flag) res = 1;
else
if(res==-1) res = last+1;
return res;
}
};