[leetcode]41. First Missing Positive,C++/python實現,hard難度
阿新 • • 發佈:2019-01-31
題目
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;
}
};