题目
41. 缺失的第一个正数
题解
这题让我们实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。现在我们先放松要求,如果不需要常数级别的空间我们该怎么实现呢?那我们可以开个数组st来记录是否出现这个数,出现则标为true,最后从小到大遍历一遍找到没有出现过的数就可以了。然后我们回到题目,他要求用常数级别的空间来实现,我们可以用原地哈希来实现,将数值i放到他该呆的位置,因为正整数是从1开始的,而我们数组下标是从0开始的。所以数值i对应的位置是i-1。我们下面用while不用if是因为要确保数字正确归位,如果不明白可以把 3 4 -1 1 这组数据丢进去理解一下。
class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();for(int i = 0; i < n; i ++){while(nums[i] <= n && nums[i] > 0 && nums[nums[i] - 1] != nums[i]) 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;}
};