LeetCode41題--First Missing Positive(尋找丟失的最小正整數)

這一題如果不要求時間複雜度O(n),空間複雜度O(1),那還是有很多種辦法可以做的,不過既然加了這些限制,就必須考慮用什麼算法來求解了。

我個人覺得,這一題主要是要想到,長度爲n的數組,要找的數最大隻可能是n+1,也就是要找的數會小於等於n。然後怎麼判斷這個數是n+1以內的數呢?通常做法我們是用一個flag數組,遍歷一遍就知道哪個數是沒有出現了,但是這裏只允許O(1)的空間複雜度,所以可以採用在原地處理的方式,把這個區間內的數放到它應該在的位置

比如如果有元素1,那麼它應該被放到0的位置,如果有元素4,它應該被放到3的位置,如果有元素k,那它應該被放到k-1的位置。

#include<algorithm>
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        if(nums.size() == 0)
            return 1;
        int n = nums.size();//獲取總長度,則要找的這個數肯定小於等於n+1
        //接下來把數組在1到n範圍內的數都擺放到應該在的位置上,如果後期檢查這個位置上的數不是在這裏的,那就證明這個數是要找的
        for(int i = 0;i < n;)
        {
            if(nums[i]>=1 && nums[i] <= n)//這個數在範圍內,它是否在他正確的位置上呢?
            {
                if(nums[i] != i+1 && nums[nums[i]-1] != nums[i])//不在正確位置上,那就把這個數換到它正確的位置上去(前提是那個數和這個不相等,不然就陷入死循環了)
                {
                    swap(nums[nums[i]-1],nums[i]);//比如5,應該放到nums[4]那裏去
                    continue;
                }
            }
            ++i;
        }
        for(int i = 0;i < n;++i)//檢查每個位置上是不是正確的數
            if(nums[i] != i+1)
                return i+1;
        return n+1;//如果最後沒找到值與位置不匹配的數,證明正好就是前n個數在那裏,所以返回n+1
        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章