↓快轉到主要內容
  1. LeetCode/

LeetCode 3919: Minimum Cost to Move Between Indices

·1 分鐘· ·
LeetCode Medium Greedy Prefix-Sum Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-05-03

  • 提交紀錄:Accepted ×2

解題思路
#

nums 嚴格遞增,所以從 l 跳到 r 的成本 |nums[l] - nums[r]| 就是中間每一段差值的總和。一步一步走時,每一步 i → i + 1 的成本是:

  • 1,如果 closest(i) == i + 1;
  • 否則是差值 nums[i + 1] - nums[i](差值至少是 1)。

每一步都不會比差值貴,所以一步一步走一定不比直接跳差;往反方向繞路只會多花。往右走和往左走各建一個前綴和,每個查詢 O(1)(Greedy 模板五)。

我的解法
#

class Solution:
    def minCost(self, nums: List[int], queries: List[List[int]]) -> List[int]:
        n = len(nums)
        closest = [0] * n
        closest[0], closest[-1] = 1, n - 2  # 兩端只有一個鄰居
        for i in range(1, n - 1):
            closest[i] = i - 1 if nums[i] - nums[i - 1] <= nums[i + 1] - nums[i] else i + 1
        right = [0] * n                        # right[i]:從 0 走到 i 的成本
        for i in range(1, n):
            right[i] = right[i - 1] + (1 if closest[i - 1] == i else nums[i] - nums[i - 1])
        left = [0] * n                         # left[i]:從 n-1 走到 i 的成本
        for i in range(n - 2, -1, -1):
            left[i] = left[i + 1] + (1 if closest[i + 1] == i else nums[i + 1] - nums[i])
        return [right[r] - right[l] if l <= r else left[r] - left[l] for l, r in queries]

複雜度
#

時間 O(n + q),空間 O(n)。

要特別避免的錯誤
#

  • 往右和往左的成本不一樣(closest 不對稱),要建兩個前綴和。
  • 距離相同時 closest 選較小的 index,所以比較要用 <=。

面試口說整理
#

陣列嚴格遞增,直接跳的成本等於中間差值的總和,而一步一步走時每一步最多花差值、遇到 closest 只花 1,所以一步一步走最好。往右、往左各建前綴和,每個查詢相減就好。時間 O(n + q)。

相關文章

LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊
LeetCode 2271: Maximum White Tiles Covered by a Carpet
·1 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 2271 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分
LeetCode 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 3914: Minimum Operations to Make Array Non Decreasing
·1 分鐘
LeetCode Medium Greedy Array
LeetCode 3914 解題筆記:對區間加 x 只會讓左邊界的差值變大 x,所以答案是所有下降量的總和
LeetCode 3904: Smallest Stable Index II
·1 分鐘
LeetCode Medium Prefix-Sum Array
LeetCode 3904 解題筆記:前綴最大值減後綴最小值 <= k 的第一個 index;後綴最小值先從右往左建好
LeetCode 3719: Longest Balanced Subarray I
·1 分鐘
LeetCode Medium Hash-Table Prefix-Sum Segment-Tree Array
LeetCode 3719 解題筆記:n 只有 1500,固定左端點往右擴,用兩個集合增量維護不同的奇數和偶數