题目
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.
分析
题意很简单,找出第一个缺失的正数。但却是Hard难度,原因就是在于On的时间复杂度和O1的空间复杂度。
我们知道这个数组大小是固定的,记为n,那么第一个缺失的正数的最大的情况就是这n个数正好是1到n,那么缺的就是n+1。这给我们的启发就是我们只需要关心数组中的那些正常数字。
什么是正常数字,就是要满足刚说的条件:首先得是正数,因为题目就是要求缺失的正数,其次在正常范围内,因为第一个缺失的最大不过是n+1,对于超过这个范围的数字我们都不需要去管它。
那么得到正常的数字有什么用?我们只需要把这些数按照大小放在它合适的位置上,比如1就放在第一个位置,2就放在第二个,如何能建立这样的位置对应关系呢?其实可以通过利用数组的下标来实现,比如数组的0号位置就应该放1(如果1在数组中的话),i号位置就应该放i+1,这样我们在第二遍遍历数组的时候,只需要判断当前位置i是否是i+1,如果不是的话,那就意味着第一个缺失的数就是i+1。
代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for (int i = 0; i < nums.size(); ++i) {
//valid number
while (nums[i] <= nums.size() && nums[i] > 0 && nums[nums[i] - 1] != nums[i]) {
swap(nums[nums[i] - 1], nums[i]);
}
}
int i;
for (i = 0; i < nums.size(); ++i) {
if (nums[i] != i + 1) break;
}
return i + 1;
}
};