【leetcode】First Missing Positive(hard) ☆
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0]
return 3
,
and [3,4,-1,1]
return 2
.
Your algorithm should run in O(n) time and uses constant space.
思路:
又是一个不让排序,但是要得到跟排序有关信息的。想了半天,只能空间换时间,可是又只能用常量空间,这可难到我了。完全想不出来。放弃看答案。
发现,答案中其实是用了空间换时间的思想的,但是这里的空间直接就用了最开始的数组。
具体的思路是:从第一个数字开始,把正数换到按顺序排序的位置上。即1放到位置0,2放到位置1。直到当前位置的数字变成正确的数字。如果遇到小于0的数字或者大于元素个数的数字跳过,因为如果后面有对应位置的数字的话是会换过来的。
代码:
class Solution { public: int firstMissingPositive(vector<int>& nums) { for(int i = 0; i < nums.size(); ++i) { while(nums[i] > 0 && nums[i] <= nums.size() && nums[nums[i] - 1] != nums[i]) //其实这里不要nums[i] > 0 也可以 就是会慢一点 swap(nums[i], nums[nums[i] - 1]); //交换数字 直到当前位置数字正确 或者 数字无法按序放在当前矩阵中 } int i; for(i = 0; i < nums.size(); ++i) { if(nums[i] != i + 1) break; } return i + 1; } };