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

LeetCode 2200: Find All K-Distant Indices in an Array

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

基本資料
#

難易度: easy 第一次嘗試:2026-01-04

  • 提交紀錄:Accepted(暴力)→ Wrong Answer → Accepted ×2

解題思路
#

每個 nums[j] == key 的位置,會讓 [j - k, j + k] 裡的 index 都成為答案。把這些區間聯集起來、依序輸出。

依序掃過每個 key 的位置,區間的起點只會越來越右,所以用一個指針 next_start 記住「已經輸出到哪裡」:下一個區間從 max(next_start, j - k) 開始輸出,就不會重複。

我的嘗試
#

第一版:暴力
#

對每個 index 檢查所有 key 的位置,有一個距離 <= k 就加入。正確,時間 O(n · key 的數量)。

第二版:區間重疊時重複輸出
#

改成對每個 key 輸出 [j - k, j + k],但沒有處理區間重疊。例如 nums = [2, 3, 2, 1, 1, 2, 1, 2]、key = 2、k = 3:每個 key 的區間都互相重疊,同一個 index 被輸出好幾次,答案變成 [0, 1, 2, 3, 0, 1, 2, 3, 4, 5, ...]。

加上一個記錄上一個區間結尾的指針就 AC 了。

正確解法
#

class Solution:
    def findKDistantIndices(self, nums: List[int], key: int, k: int) -> List[int]:
        n = len(nums)
        res = []
        next_start = 0                         # 下一個還沒輸出的 index
        for j, x in enumerate(nums):
            if x == key:
                start = max(next_start, j - k)
                end = min(n - 1, j + k)
                res.extend(range(start, end + 1))
                next_start = end + 1
        return res

複雜度
#

時間 O(n):每個 index 最多被輸出一次。空間 O(1),不算輸出。

要特別避免的錯誤
#

  • 區間重疊時重複輸出。
  • 區間沒有限制在 [0, n - 1]。

面試口說整理
#

每個等於 key 的位置 j 會讓 [j - k, j + k] 都成為答案。我依序掃過 key 的位置,用一個指針記住已經輸出到哪裡,下一個區間從 max(指針, j - k) 開始,這樣重疊的部分不會重複輸出,每個 index 最多輸出一次,時間 O(n)。

相關文章

LeetCode 1089: Duplicate Zeros
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 1089 解題筆記:先數有幾個 0 決定每個數要往後移幾格,再從後往前搬,遇到 0 時把複製的那個 0 也寫進去
LeetCode 977: Squares of a Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 977 解題筆記:平方後最大的一定在兩端,左右指針比較兩端的平方,大的從結果的最後面往前填
LeetCode 905: Sort Array By Parity
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 905 解題筆記:寫入指標把偶數交換到前面,跟 move zeroes 一樣
LeetCode 922: Sort Array By Parity II
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 922 解題筆記:偶數位置的指標 i、奇數位置的指標 j,各自跳兩格;i 放錯(奇數)時讓 j 找到放錯的偶數再交換
LeetCode 821: Shortest Distance to a Character
·1 分鐘
LeetCode Easy Array Two-Pointers String
LeetCode 821 解題筆記:左往右掃一次記錄到左邊最近的 c 的距離,右往左再掃一次取較小值
LeetCode 832: Flipping an Image
·1 分鐘
LeetCode Easy Array Two-Pointers Bit-Manipulation Matrix
LeetCode 832 解題筆記:每一列先左右反轉再把 0、1 互換;可以用左右指針同時做