1. 程式人生 > >45 jump-game-ii

45 jump-game-ii

這道題目和以前一道能不能跳到最後一點的題目有比較類似的思路,但是要稍微難一點,因為要求出最小的跳數。

題目的大體意思是這樣的,給定一個一維陣列,陣列中每一位上的數字表示從該位置能向後一跳的最遠距離是多少(之所以說最遠是可以在0~最遠值之間任意選擇一個合適的數值),問到達最後一個位置所經歷的最小跳數。這種題目基本上窮舉是肯定不行的,因此,要有一些小的處理技巧。另外,值得注意的是,這道題給出的所有測試用例沒有不能到達的情況。

要知道哪種方案跳數最低,在未能到達最後一個位置之前,必須要對所有點進行遍歷,來檢視所有可能的情況,從而選擇最優。

從出發位置開始,設定一個變數每次迴圈都記錄從該位置能到達的最遠位置是多少,該變數用來表示我們下一次迴圈都有哪些新的點可以遍歷到,然後繼續往後遍歷,直到到達最後一點為止。

理論講起來比較費解,但是程式碼很簡單,只要55題做了,這道題不難理解

class Solution {
public:
    int jump(vector<int>& nums) {
        int minstep = 0;
        int cur = 0, i = 0, maxsize = 0;
        while (cur < nums.size()-1) {
            ++minstep;
            maxsize = cur;
            for (; i<=maxsize; ++i) {
                cur = max(cur, i+nums[i]);
            }
        }
        return minstep;
    }
};