1. 程式人生 > >【leetCode】45_跳躍遊戲2

【leetCode】45_跳躍遊戲2

思路:

一句話的話就是,我們現在站在pos點,下一個我們到達的點是next_pos,這個點是怎麼選出來的呢?

next_pos是,(pos走一步能到達的點再往前走一步能走到最遠)的pos走一步能到達的點。這種點可能不止一個,我選擇的是距離pos最遠的點,但我覺得哪一個都可以。

pos是當前點,記集合S為 $ \left \{ s \quad |\quad pos < s \leq pos + nums[pos] \right \} $,即pos能到達的點的集合。

我們的下一個起點為next_pos,$ next\_ pos= \max \{t \quad \vert \quad t+num[t] = \max \{s+nums[s] \quad \vert \quad s \in S \}\}$

裡邊的max是得到了S裡的點再走一步能到達的最遠的位置,t是這些能到達這個最遠位置的S的子集,從這個子集中選擇一個最大的。

class Solution {
public:
    int jump(vector<int>& nums) {
        int count = 0;
        if (nums.size() == 0)
            return 0;
        for (int i = 0; i < nums.size() - 1;){
            if (nums[i] + i >= nums.size() - 1){
                count += 1;
                return count;
            }
            int imax = -1;
            int next_pos = -1;
            for (int j = 1; j <= nums[i] && i + j < nums.size(); j ++){
                if (i + j + nums[i + j] > imax){
                    next_pos = i + j;
                    imax = i + j + nums[i + j];
                }
            }
            count ++;
            i = next_pos;
        }
        return count;
    }
};