题目:
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.
题目分析:
题目意思是给定一个无序数组,要我们找出最小的没出现的正数,只能使用O(n)的时间复杂度和O(1)的空间复杂度
空间复杂度的要求我们只能使用原来的数组来储存,因此我们可以把数组的数放到该值的下标中,也即如果我们发现了一个3,这个3应该放到数组的下标为2的地方,当我们扫描一遍数组就能把每个正数都放到应该的地方,然后我们再扫描一次,发现一个地方没有出现对应正数返回下标+1即可
c++代码:
class Solution {
public:
void exchange(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
int firstMissingPositive(vector<int>& nums) {
int i = 0;
int n = nums.size();
while (i < n) {
if (nums[i] != i + 1 && nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i] )
{
exchange(nums[i], nums[nums[i] - 1]);
} else {
++i;
}
}
for (int i = 0; i < n; ++i) {
if (nums[i] != (i + 1))
return i + 1;
}
return n + 1;
}
};