41. First Missing Positive

1.問題

2.想法

  • 提問

    • 確認題意: 每個element是依照1, 2, 3, 4...的順序排列, 並找出沒有出現在應有的位置上

  • function header, parameter

  • test input

  • 說明想法

    • 規則: 即A[i]的值應該是i + 1, 而且A[i]的值應該是A[A[i] - 1]

    • 因此我們可以確認A[i]與A[A[i] - 1]是否相同, 若不同則swap, 最後確認每個位置的值是否是i + 1, 若都沒問題則返回length + 1

  • 測試計算複雜度

3.程式碼

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int size = nums.size(), i = 0;
        while (i < size) {
            if (nums[i] <= size &&
                nums[i] > 0 &&
                nums[i] != nums[nums[i] - 1]) {
                swap(nums, i, nums[i] - 1);
            } else {
                i++;
            }
        }
        
        for (i = 0; i < nums.size(); i++) {
            if (nums[i] != (i+1) ){
                return i+1;
            }
        }
        
        return size + 1;
    }
private:
    void swap(vector<int>& nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
};

Last updated