解题思路
类似的题有好几道,我暂且把它们叫做“交换归位”吧,最核心的是使用了两个变量,用来左右夹逼。
l
-表示已经收集到的连续正整数
r
-表示最多可能收集到的正整数
在以下三种情况下,我们的最多收集r
需要减小1
arr[l] <= l
arr[l] > r
arr[arr[l] - 1] == arr[l]
如果当前下标加1刚好等于下标所在的值,l
就加1
代码如下
class Solution {
public:
int firstMissingPositive(vector<int>& arr) {
int n = arr.size();
int l = 0, r = n;
while(l < r){
if(arr[l] == l + 1) ++l;
else if(arr[l] <= l || arr[l] > r || arr[arr[l] - 1] == arr[l]){
arr[l] = arr[--r];
}else{
swap(arr[l], arr[arr[l] - 1]);
}
}
return l+1;
}
};