置頂

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

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

熱門文章

2026年8月30日 星期日

LeetCode 解題筆記:2091. Removing Minimum and Maximum From Array

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


LeetCode 題目連結:2091. Removing Minimum and Maximum From Array

解題想法


中等難度題。題目給一個陣列 $nums$,要刪除 $nums$ 之中的最大值及最小值,可以從陣列兩端往中間刪除數字,回傳最少的刪除數量。解題時先找出最大值、最小值的索引值,取兩者的最小值為 $left$、最大值為 $right$,$nums$ 長度為 $n$,接下來只有 3 種可能性:
  1. 從陣列開頭往後刪除,刪除索引值 $0$ 到 $right$,數量為 $right + 1$。
  2. 從陣列結尾往後前除,刪除索引值 $n-1$ 到 $left$,數量為 $n - left$。
  3. 從陣列兩端同時往中間刪除,刪除索引值 $0$ 到 $left$ 及 $n-1$ 到 $right$,數量為 $left + 1 + n - right$。
答案是以上 3 種數量的最小值。

Python 程式碼


Runtime: 12 ms, beats 88.52%. Memory: 33.64 MB, beats 35.35%.
class Solution:
    def minimumDeletions(self, nums: List[int]) -> int:
        n = len(nums)  # 長度
        max_pos = nums.index(max(nums))  # 最大值的索引值
        min_pos = nums.index(min(nums))  # 最小值的索引值
        left = min(max_pos, min_pos)  # 左側目標索引值
        right = max(max_pos, min_pos)  # 右側目標索引值
        return min(right + 1, n - left, left + 1 + n - right)


C++ 程式碼


Runtime: 0 ms, beats 100.00%. Memory: 91.98 MB, beats 86.87%.
class Solution {
public:
    int minimumDeletions(vector<int>& nums) {
        int n = (int)nums.size();  // 長度
        int max_pos = max_element(nums.begin(), nums.end()) - nums.begin();  // 最大值的索引值
        int min_pos = min_element(nums.begin(), nums.end()) - nums.begin();  // 最小值的索引值
        int left = min(max_pos, min_pos);  // 左側目標索引值
        int right = max(max_pos, min_pos);  // 右側目標索引值
        return min(right + 1, min(n - left, left + 1 + n - right));
    }
};


C 語言程式碼


Runtime: 0 ms, beats 100.00%. Memory: 16.86 MB, beats 52.17%.
int minimumDeletions(int* nums, int numsSize) {
    // 最大值,最小值,最大值的索引值,最小值的索引值
    int imax = -1000000, imin = 1000000, max_pos =  0, min_pos = 0; 
    for(int i = 0; i < numsSize; i++) {
        int num = nums[i];
        if (num > imax) {
            imax = num;
            max_pos = i;
        }
        if (num < imin) {
            imin = num;
            min_pos = i;
        }
    } 
    
    // 左側目標索引值,右側目標索引值
    int left = min_pos;
    if (max_pos < min_pos) left = max_pos;
    int right = min_pos;
    if (max_pos > min_pos) right = max_pos;
    
    int ans = right + 1, val2 = numsSize - left, val3 = left + 1  + numsSize - right;
    if (val2 < ans) ans = val2;
    if (val3 < ans) ans = val3;
    return ans;
}


沒有留言:

張貼留言