1. 程式人生 > >LetCode 41. 缺失的第一個正數

LetCode 41. 缺失的第一個正數

// 1. 負數或者是0:比如陣列[-1, 2],-1對不上,但是也不動
// 2. 超出了陣列長度:比如陣列[7, 8],兩個數都超出了陣列長度,保持不動
// 3. 要交換的位上的數是正確歸位的:比如陣列[3, 2, 3],第一個3本來應該與第三位的數(也就是3)交換,但是顯然3這個數已經正確歸位了,雖然在不正確的位上也有他,保持不動。


// 以上三條,其實依然保證了陣列第一個沒被正確歸位的位所應該歸位的數是丟失的第一個正整數(特別地,如果陣列所有位都合適,比如[1, 2, 3],那麼返回的是4)。也就是說,這裡的bucket_sort函式其實並沒有真正意義上實現排序,而是對陣列每一位“儘可能”尋找對應的數。例如,對[3, 4, -1, 1],執行bucket_sort後變為[1, -1, 3, 4];[1, 1, 2]執行bucket_sort後變為[1, 2, 1]。
static int x=[](){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    return 0;
}();
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++){
            // 對應著上面的三條規則
            while(nums[i] > 0 && nums[i] - 1 < nums.size() && nums[nums[i] - 1] != nums[i])
                swap(nums[nums[i] - 1], nums[i]);
        }
        // 最後掃描一遍,第一個數與座標不同的就為丟失的第一個整數
        for (int i = 0; i < nums.size(); i++){
            if (i != nums[i] - 1)
                return i + 1;
        }
        return nums.size() + 1;
    }
};