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.
Solution:
要在 O(n) O ( n ) 时间内找出最小的缺少的最小的正整数,并且只能使用常数的额外空间,显然排序算法是行不通的。
那么从常规思路出发是无法解决的,但是在数组中有一个天然排好序的东西,数组下标,刚好在这里需要用到,只需要在数组中第 i i 个存的是就行了。不满足条件的交换到对应位置去。
然后从左到右找到第一个不满足条件的 i+1 i + 1 就是缺少的最小正整数。
int firstMissingPositive(int* nums, int numsSize) {
int temp;
for(int i=0; i < numsSize; ++i) {
if(nums[i] > 0 && nums[i] != i+1 && nums[i] < numsSize && nums[nums[i]-1] != nums[i]) {
temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
--i;
}
}
for(int i=0; i< numsSize; ++i) {
if(nums[i] != i+1)
return i+1;
}
return numsSize+1;
}