1. 程式人生 > >[leetcode]41. First Missing Positive,C++/python實現,hard難度

[leetcode]41. First Missing Positive,C++/python實現,hard難度

題目

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;
    }
};