这题有点儿烧脑了,就是没有出现的最小的正数一定是 1 到 n + 1 这个范围的,为啥呢,因为总共是 n 个元素,我们考虑最极端的情况,全是正整数,那么 1 到 n 没有缺失,那最小的正整数就是 n + 1 了,如果有负数,那么负数肯定就不算了,比如说 -1 1 2 ,n == 3, 预期的结果是 3 ,在 1 到 4 这个范围内,所以还是比较秀的。这个结论,就是这个题的关键部分。然后我们可以考虑,一个比较大的数字,比如说,2147483647 是最大的正整数,那么不影响结论呀,我们输出缺失的最小的正整数,直接输出 1 就完事了。这个困难题绝对的纸老虎。
cpp
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for ( int i = 0; i < n; i++ ) {
while ( nums[i] >= 1 && nums[i] <= n && nums[i] != nums[nums[i] - 1] ) {
swap( nums[i], nums[nums[i] - 1] );
}
}
for ( int i = 0; i < n; i++ ) {
if ( nums[i] != i + 1 ) {
return i + 1;
}
}
return n + 1;
}
};