// Algorithm: sort nums; a good array becomes [1, 2, ..., n-1, n, n] after sorting.
// 演算法：排序後，好的陣列形如 [1, 2, ..., n-1, n, n]。
// Then verify nums[i] == i+1 for i < size-1 and nums[size-1] == size-1.
// 接著驗證 nums[i] == i+1 (除最後一格)，且最後一格 == size - 1。

class Solution {
public:
    // vector<int>& 是「整數動態陣列的參考」，避免複製
    // vector<int>& is a reference to a dynamic int array — passed by reference to avoid copying
    bool isGood(vector<int>& nums) {
        // std::sort 預設由小到大排序，平均 O(k log k)
        // std::sort sorts ascending by default; average O(k log k)
        // nums.begin() / nums.end() 是迭代器，指向第一個元素與「最後一個之後」
        // begin()/end() are iterators marking the first element and one-past-the-last
        sort(nums.begin(), nums.end());

        // .size() 回傳元素個數，型別為 size_t (無號)；轉成 int 方便算術
        // .size() returns the element count as size_t; cast to int for arithmetic
        int k = (int)nums.size();

        // 預期的 n = 長度 - 1 / expected n = length - 1
        int n = k - 1;

        // 邊界：長度 1 不可能是任何 base[n] (base[n] 最短為 base[1] 長 2)
        // edge: length 1 cannot match any base[n] (shortest is base[1] of length 2)
        if (n < 1) return false;

        // 範圍 for 也行，但這裡需要索引，所以用傳統 for
        // could use range-for, but we need the index i, so a classic for loop is clearer
        for (int i = 0; i < k - 1; i++) {
            // 前 k - 1 格應為 1, 2, ..., n - 1, n (倒數第二格)
            // first k - 1 slots should be 1, 2, ..., n-1, n (the second-to-last slot is also n)
            if (nums[i] != i + 1) return false;
        }

        // 最後一格應等於 n (n 出現兩次的第二次)
        // last slot should equal n (the second occurrence of n)
        if (nums[k - 1] != n) return false;

        // 所有檢查通過 / all checks passed
        return true;
    }
};
