日期:2026年8月30日
LeetCode 題目連結:2091. Removing Minimum and Maximum From Array
解題想法
中等難度題。題目給一個陣列 $nums$,要刪除 $nums$ 之中的最大值及最小值,可以從陣列兩端往中間刪除數字,回傳最少的刪除數量。解題時先找出最大值、最小值的索引值,取兩者的最小值為 $left$、最大值為 $right$,$nums$ 長度為 $n$,接下來只有 3 種可能性:
- 從陣列開頭往後刪除,刪除索引值 $0$ 到 $right$,數量為 $right + 1$。
- 從陣列結尾往後前除,刪除索引值 $n-1$ 到 $left$,數量為 $n - left$。
- 從陣列兩端同時往中間刪除,刪除索引值 $0$ 到 $left$ 及 $n-1$ 到 $right$,數量為 $left + 1 + n - right$。
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;
}
沒有留言:
張貼留言