大意:输出数组中未出现过的最小整数
简单思路:
1.排序,然后找到第一个不符合A[i]=i+1的元素即为正确答案。时间:O(nlgn) 额外空间:O(1)
2.一个哈希记录表,将所有出现过的元素记录为true。时间:O(n) 额外空间:O(max(A))
然而题目要求O(n)的时间复杂度和O(1)的空间复杂度,因此比较灵活
思路:
1.将原数组上所有1~len之间的元素放到0~len-1(通过swap)
2.找到第一个i使得A[i]!=i+1,i+1即为正确答案
3.这种思路实际上是利用原数组起到了类似上边2中哈希记录表的作用,不过这种方式非常灵活。
代码如下:
int firstMissingPositive(vector<int>& nums) {
for(int i=0; i<nums.size(); )
{
if(nums[i]==i+1||nums[i]<=0||nums[i]>nums.size())
i++;
else if(nums[nums[i]-1]!=nums[i]){
swap(nums, i, nums[i]-1);
}else
i++;
}
int i;
for(i=0; i<nums.size(); i++)
if(nums[i]!=i+1)
return i+1;
return i+1;
}
void swap(vector<int>& nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}