leetcode41_缺失的第一個正數_數組技巧

1. 這題其實沒有想象中的那麼難,關鍵得利用數組的特性,我們得將不在正確位置的數放在對應的正確的位置上,然後再遍歷,得到不滿足條件的那個數,即爲缺失的那個數.

2. 卡了好長時間是因爲這個交換兩個數需要特別注意,順序錯了不行,因爲交換的數的索引含有nums[i],即爲nums[nums[i]-1],因此順序一點不能錯,這也是最需要注意的地方.

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        //邊界條件
        if(nums.size()==0) return 1;
        for(int i=0;i<nums.size();) {
            //只有當數不在範圍內,或者對應的數在正確的位置,纔不需要做任何改變.
            //也只有此時才能i++,因爲下面交換過的數有可能還是不在正確的位置,
            //所以一直到滿足if條件纔不需要繼續交換.
            if(nums[i]<=0 || nums[i]>=nums.size()+1 || nums[nums[i]-1]==nums[i]) {
                i++;
                continue;
            }
            //不在正確的位置需要交換到正確的位置.
            //強烈注意交換的順序,只能有這麼一種方式,
            //因爲nums[i]也出現在索引中,所以我們只能最後改變
            //nums[i]的值纔不會影響前面的交換.
            int tmp = nums[nums[i]-1];
            nums[nums[i]-1] = nums[i];
            nums[i] = tmp;
        }
        //遍歷找到不在正確位置的數返回,即爲缺失的值.
        for(int i=0;i<nums.size();i++) {
            if(nums[i]!=i+1) return i+1;
        }
        //如果都滿足,則缺失之後的數.
        return nums.size()+1;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章