41. First Missing Positive
Given an unsorted integerarray, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
Your algorithm should runin O(n) time and uses constantspace.
Subscribe to see whichcompanies asked this question.
算法思想
因为不能请求额外的空间,只能在原来的数组进行操作,并且要求在O(n)时间下完成,所以考虑一种给每一个数字安排一个座位,并且令其下标志符合唯一一个元素值,比如a[i] = i+1。然后得到一个新的序列,只需要检查一次,就能得到不是按照位置就坐的元素。
步骤
1. 从数组头开始遍历数组,记当前位置正确值应为pos。pos = i + 1。
2. 若
a) 当前遍历到的元素值不为pos,
b) 并且当前元素大于0,
c) 并且和上个交换的元素值不一样(避免相同数字无限交换下去),
d) 并且当前元素值小于数组最大下标(避免非法交换)
则重复第二步。
3.得到最终数组,遍历一次数组,找出不符合条件的数字。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if(nums.size() < 1 ) return 1;
int pos = 0;
int len = nums.size();
for(int i = 0 ; i < nums.size() ; i++){
pos = i + 1;
while(nums[i] != pos && nums[i] > 0 && nums[i] < len && nums[i] != nums[ nums[i] - 1])//上述的第2步
swap(nums[i],nums[ nums[i] - 1]);
}//for(i)
for(int i = 0 ; i < len ; i++){
pos = i + 1;
if(nums[i] != pos ) return pos;
}
return pos + 1;
}
};