题目
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.
Subscribe to see which companies asked this question
刚开始觉得挺简单的,一看好多限制条件,要O(n)的时间复杂度,而且还要常数空间。
分析一下:因为是最小的整数,
反正是从1,2,3。。。。开始的。
那就把每一个数,给到他们自己的位置,比如说【3,4,-1,1】
把所有的数都放到位置:变成【1,-1,3,4】 那就能找到 那个-1的位置了。
因为要常数空间,那估计的言外之意就是,交换swap。
1.不过这里面有坑,首先【2,3】这样的,3就不能换,也就是说大过数组长度的不要动。
3.而且小于0的也不能换,
3.还有这个【3,4,-1,1】如果只换一次。。
先换3,变成【-1,4,3,1】
然后4 变成【-1,1,3,4】
哎到头了。。。这个1怎么办。。。
所以要不停的换,换到不能换了为止:
改成:
先换3,变成【-1,4,3,1】,第一个位置是-1,不能换了
再还4,变成【-1,1,3,4】,第二个位置是1,继续换【1,-1,3,4】
后面就不换了。。。
4.还有一个坑:【1,2,3】。。。换到头了,怎么办,返回4。
下面上代码:
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
L=len(nums)
for m in range(L):
if nums[m]>L:
continue
val = nums[m]-1
while nums[m]>0 and val<L and nums[val] != nums[m]:
#小于等于0,大于等于长度的不换。
nums[m],nums[val]=nums[val],nums[m]
val = nums[m]-1
for m in range(len(nums)):
if nums[m] != m +1:
return m +1
return L+1
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if(nums.size()==0)return 1;
int t;int p=1;
while(p){
p=0;
for(auto i=nums.begin();i!=nums.end();i++){
if(*i>0){
t=*i;
if(t>nums.size())continue;
if(*i==*(nums.begin()+t-1))continue;
*i=*(nums.begin()+t-1);
*(nums.begin()+t-1)=t;
p=1;
}
}
}
for(auto i=nums.begin();i!=nums.end();i++){
if(*i!=i-nums.begin()+1)return i-nums.begin()+1;
}
return nums.size()+1;
}
};