iT邦幫忙

2026 iThome 鐵人賽

DAY 23
1
Software Development

快樂演算法系列 第 23

遇到五百了why & 322 v3 & 55

  • 分享至 

  • xImage
  •  
  1. recap 322 目前金額 → 拿coin → 扣掉 → 查前面dp → +1 → min。

  2. 55:從這格最多可以往右跳幾步

class Solution {
public:
    bool canJump(vector<int>& nums) {//能否到最後格
        int farthest = 0;//目前最遠可到index

        for (int current = 0; current < nums.size(); ++current) {//從左到右檢查每一格
            if (current > farthest)//目前位置已超可到範圍
                return false;//走不到這裡,直接失敗

            farthest = max(farthest, current + nums[current]);//更新目前最遠能到哪

            if (farthest >= nums.size() - 1)//已經能到最後一格
                return true;// 直接ok
        }

        return true;//全走完也表已到
    }
};

4.有一點像417 Pacific Atlantic同問現在這格能否到下一範圍(先定義能不能走,再依規則更新可達範圍),但55就只有一路比較目前最遠能到哪,所以核心是比大小、更新最大值。

但這題不是比高度,而是比:current + nums[current]誰能把 farthest 推得更遠;所以核心確實是持續比較並保留目前最遠距離。

5.確認合法範圍是演算法常態:Grid 題看有沒有超出邊界,Jump Game看current > farthest,本質都是先確認這一步是不是還在可達/合法範圍內

目前位置是否合法、有無超出可達範圍、有無超出陣列邊界,在 Array、Graph、BFS、DFS、Greedy都常出現。

6.不用真的決定每一步怎麼跳,只維護最遠能到哪裡這一個狀態。這就是 Greedy(貪婪演算法)的重點。

7.nums = [2,3,1]

一開始:
current = 0
farthest = 0

看 nums[0] = 2:
current + nums[current]
= 0 + 2
= 2

所以:farthest = 2
->從index 0出發,現在知道最遠可以到index2
此時不用真的決定:0 → 1還是0 → 2只要知道:最遠能到 2就夠了。
接著看 index 1:1 + nums[1] = 1 + 3 = 4

可以先看一下第八點再釐清一下:)

所以:
farthest = max(2,4)
= 4

又把可達範圍推更遠。

Greedy 在這題就是:每到一格,只保留「目前能到的最遠位置」,不去模擬所有跳法。

8.想到跳棋:現在站在哪個index + 這格最多能跳多遠 = 從這格最遠能到哪裡。

nums = [2,3,1]
index 0 1 2
value 2 3 1

所以:
index 0:
0 + nums[0]
= 0 + 2
= 最遠到 index 2

再來看 index 1:
1 + nums[1]
= 1 + 3
= 最遠到 index 4

不是說「一定從 0 跳到 1」,而是:只要 index 1 本身在目前可達範圍內,就可以拿它來繼續更新更遠的範圍。


上一篇
ground truth second train and test 差 哎 & 322 v2
下一篇
搭火車真的看到農噴機working好大及噴灑比想像廣 & 55 v2
系列文
快樂演算法25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
AndyAWD
iT邦研究生 5 級 ‧ 2026-09-11 23:50:40

那裡湖面總是澄清,那裡空氣充滿寧靜

或許我 不該問 server是發生了什麼事XD

我要留言

立即登入留言