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

LeetCode 1989: Maximum Number of People That Can Be Caught in Tag

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

基本資料
#

難易度: medium 第一次嘗試:2026-01-27

  • 提交紀錄:Wrong Answer → Accepted(2026-01-28)

解題思路
#

貪心:鬼從左到右處理,每個鬼抓自己範圍 [i - dist, i + dist] 裡最左邊、還沒被抓的人。左邊的人只有現在的鬼和更左邊的鬼抓得到,留給右邊的鬼沒有用;右邊的人留給後面的鬼,選擇更多。

用指針 j 指向「下一個可能被抓的人」:

  • 跳過所有鬼,以及 j < i - dist 的人(太左邊,之後的鬼更抓不到)。
  • 如果 j <= i + dist,抓到,j 前進。

我的嘗試
#

第一版用「人」當主角:left 找下一個人、right 找第一個能抓到他的鬼。問題是:如果這個人左右兩邊都沒有鬼抓得到,right 會一路往右跳過所有鬼,直到 n 才停,應該被跳過的是這個人,不是鬼。

例如 team = [0, 0, 1]、dist = 1:位置 0 的人抓不到,但位置 2 的鬼可以抓位置 1 的人,答案是 1。這版找位置 0 的人時,right 越過位置 2 的鬼,回傳 0。

改成以鬼為主角、讓「人」的指針跳過太左邊的人,就 AC 了。

正確解法
#

class Solution:
    def catchMaximumAmountofPeople(self, team: List[int], dist: int) -> int:
        n = len(team)
        caught = 0
        j = 0                                      # 下一個候選的人
        for i in range(n):
            if team[i] != 1:
                continue
            while j < n and (team[j] == 1 or j < i - dist):
                j += 1                             # 跳過鬼和太左邊的人
            if j < n and j <= i + dist:
                caught += 1
                j += 1
        return caught

複雜度
#

時間 O(n):i 和 j 都只往右。空間 O(1)。

要特別避免的錯誤
#

  • 抓不到的人要跳過,不能為了他把鬼都跳過。
  • 每個鬼要抓最左邊的人,不是最近的人。

面試口說整理
#

我從左到右處理每個鬼,讓它抓範圍內最左邊、還沒被抓的人,因為左邊的人之後的鬼只會更抓不到。用一個只往右走的指針指向下一個候選人,跳過鬼和太左邊的人,如果它在鬼的範圍內就抓。兩個指針都只往右,時間 O(n)。

相關文章

LeetCode 948: Bag of Tokens
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 948 解題筆記:排序後,用最小的 token 換分數、用最大的 token 換能量;只有分數 > 0 才能換能量,換不了就停
LeetCode 611: Valid Triangle Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Greedy
LeetCode 611 解題筆記:排序後固定最長邊 k,左右指針找兩短邊:和夠大時中間的都可以,一次加 j - i 個
LeetCode 11: Container With Most Water
·1 分鐘
LeetCode Medium Array Two-Pointers Greedy
LeetCode 11 解題筆記:左右指針從兩端開始,每次移動比較矮的那一邊;移動高的那邊只會讓寬度變小、高度不會變高
LeetCode 1877: Minimize Maximum Pair Sum in Array
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 1877 解題筆記:排序後最小配最大、次小配次大,對撞指針取配對和的最大值
LeetCode 2410: Maximum Matching of Players With Trainers
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 2410 解題筆記:兩邊都排序後,用同向雙指針讓最弱的球員配最小的、夠用的教練
LeetCode 1471: The k Strongest Values in an Array
·1 分鐘
LeetCode Medium Two-Pointers Sorting Array
LeetCode 1471 解題筆記:排序後離中位數最遠的一定在兩端,對撞指針每次從兩端挑比較強的那個,挑 k 次