题目
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
note:Your algorithm should run in O(n) time and uses constant extra space.
思路
从数列开头开始逐个扫描,并把扫描到的元素与它“正确”的位置上的元素交换。这里的“正确”是指元素值等于对应下标减一,如3的正确位置为nums[2]。对数组扫描一次后,再回头扫描一次,第一个遇到的,不正确的元素即为所求的最小缺失了的元素。
代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for (int i = 0; i != nums.size(); ++i) {
while (nums[i] - 1 >= 0 && nums[i] - 1 < nums.size() && nums[nums[i] - 1] != nums[i]) {
int temp = nums[i];
nums[i] = nums[nums[i] - 1];
nums[temp - 1] = temp;
}
}
for (int i = 0; i != nums.size(); ++i) {
if (nums[i] - 1 != i) {
return i + 1;
}
}
return nums.size() + 1;
}
};
注意
- 当所有元素都被摆在正确的位置上时,返回的是下一个整数。也就是nums.size() + 1
- while语句里面的判断条件最后一项(即正确性判断)应该为
nums[nums[i] - 1] != nums[i]
(正确位置的元素不是当前元素),而不是nums[i] - 1 != i
(该元素的正确位置不是当前位置),后者在样例[1, 1]中会陷入死循环