置頂

我的 VPython 教學文件 (HackMD 版本)

VPython 教學文件目錄 安裝及測試 基本語法 等速度直線運動 自由落下 終端速度 水平抛射 使用For迴圈計算水平抛射資料 斜向抛射 圓周運動 簡諧運動 單擺 木塊彈簧系統分離 重力及簡諧 行星運動 相疊木塊 雙重簡諧運動 一維彈性碰撞 ...

熱門文章

2026年8月4日 星期二

LeetCode 解題筆記:3731. Find Missing Elements

作者:王一哲
日期:2026年8月4日


LeetCode 題目連結:3731. Find Missing Elements

解題想法


簡單題。題目給一個陣列 $nums$,其中的數字皆不相同,先找出 $nums$ 之中的最小值與最大值,再找出最小值、最大值之間不在 $nums$ 之中的整數,將缺少的整數排序後再回傳,如果沒有缺少的整數則回傳空陣列。我們可以用 Python 的 max、min 或是 C++ 的 max_element、min_element 找出最大值 $high$ 與最小值 $low$。為了標記區間 $[low, high]$ 所有的數字是否在 $nums$ 之中,可以用一個長度為 $high - low + 1$ 陣列 $found$,將 $nums$ 之中所有數字 $num$ 標示為 $found[num - low] = True$。也可以將 $nums$ 轉成 Python 的 set 或是 C++ 的 unordered_set,直接用 in 或是 count 檢查數字是否在 $nums$ 之中。兩者寫法的速度都很快。

Python 程式碼


用串列標記狀態。Runtime: 0 ms, beats 100.00%. Memory: 19.45 MB, beats 18.85%.
class Solution:
    def findMissingElements(self, nums: List[int]) -> List[int]:
        low, high = min(nums), max(nums)  # 最小值、最大值
        found = [False] * (high - low + 1)  # 是否有這個值
        for num in nums:  # 更新狀態
            found[num - low] = True
        
        ans = []  # 缺少的值
        for i in range(low + 1, high):
            if not found[i - low]:
                ans.append(i)
        return ans


用串列標記狀態,合併産生答案的程式碼。Runtime: 0 ms, beats 100.00%. Memory: 19.26 MB, beats 55.74%.
class Solution:
    def findMissingElements(self, nums: List[int]) -> List[int]:
        low, high = min(nums), max(nums)  # 最小值、最大值
        found = [False] * (high - low + 1)  # 是否有這個值
        for num in nums:  # 更新狀態
            found[num - low] = True
        
        return [i for i in range(low + 1, high) if not found[i - low]]


用 set 檢查數字是否在 $nums$ 之中。Runtime: 0 ms, beats 100.00%. Memory: 19.29 MB, beats 55.74%.
class Solution:
    def findMissingElements(self, nums: List[int]) -> List[int]:
        low = min(nums)
        high = max(nums)
        num_set = set(nums)
        
        ans = []
        for i in range(low + 1, high):
            if i not in num_set:
                ans.append(i)
        return ans


用 set 檢查數字是否在 $nums$ 之中,合併産生答案的程式碼。Runtime: 0 ms, beats 100.00%. Memory: 19.37 MB, beats 18.85%.
class Solution:
    def findMissingElements(self, nums: List[int]) -> List[int]:
        low, high = min(nums), max(nums)
        num_set = set(nums)
        return [i for i in range(low + 1, high) if i not in num_set]


C++ 程式碼


用陣列標記狀態。Runtime: 0 ms, beats 100.00%. Memory: 32.33 MB, beats 54.61%.
class Solution {
public:
    vector<int> findMissingElements(vector<int>& nums) {
        int low = *min_element(nums.begin(), nums.end());
        int high = *max_element(nums.begin(), nums.end());
        vector<bool> found (high - low + 1, false);
        for(int num : nums) found[num - low] = true;
        vector<int> ans;
        for(int i = low + 1; i < high; i++) {
            if (!found[i - low]) {
                ans.push_back(i);
            }
        }
        return ans;
    }
};


用 unordered_set 檢查數字是否在 $nums$ 之中。Runtime: 8 ms, beats 12.18%. Memory: 33.76 MB, beats 17.56%.
class Solution {
public:
    vector<int> findMissingElements(vector<int>& nums) {
        int low = *min_element(nums.begin(), nums.end());
        int high = *max_element(nums.begin(), nums.end());
        unordered_set<int> num_set (nums.begin(), nums.end());
        vector<int> ans;
        for(int i = low + 1; i < high; i++) {
            if (num_set.count(i) == 0) {
                ans.push_back(i);
            }
        }
        return ans;
    }
};


C 語言程式碼


用陣列標記狀態。Runtime: 0 ms, beats 100.00%. Memory: 13.22 MB, beats 18.45%.
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findMissingElements(int* nums, int numsSize, int* returnSize) {
    // 找出最小值、最大值,標記數字是否在 nums 之中
    int low = 1000000000, high = -1000000000, found[101] = {0};
    for(int i = 0; i < numsSize; i++) {
        int num = nums[i];
        if (num < low) low = num;
        if (num > high) high = num;
        found[num] = 1;
    }
    // 找出缺少的數字數量
    int cnt = 0;
    for(int i = low + 1; i < high; i++) {
        if (found[i] == 0) {
            cnt++;
        }
    }
    // 更新 retrunSize 為 cnt,並建立長度為 cnt 的 array,於 array 填入缺少的數字
    *returnSize = cnt;
    int idx = 0, *ans = malloc(cnt * sizeof(int));
    for(int i = low + 1; i < high; i++) {
        if (found[i] == 0) {
            ans[idx] = i;
            idx++;
        }
    }
    return ans;
}


沒有留言:

張貼留言