Lintcode117 Jump Game || solution 題解

【題目描述】

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Your goal is to reach the last index in the minimum number of jumps.

給出一個非負整數數組,你最初定位在數組的第一個位置。

數組中的每個元素代表你在那個位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達數組的最後一個位置。

【題目鏈接】

http://www.lintcode.com/en/problem/jump-game-ii/

【題目解析】

將每個位置都看作一個點,並從第i個點向它之後的nums[i]個點都連一條長度爲1的有向邊,而現在的問題就是從0號點到達size-1號點需要的最短距離,這就是一個很簡單的最短路問題,實際上由於邊的長度均爲1,而且不存在環,我們可以用寬度優先搜索(時間複雜度爲O(n^2),即邊數)來進行相關的計算。

不難發現,這道題目轉換出的最短路問題存在三個條件:

·邊的長度均爲1

·不存在環

·連出的邊是連續的

如果令f[i]表示從0號點到達i號點的最短路徑,那麼對於任意i

然後,對於f數組來說,它會是一段段的存在,先是一個0,然後是一段1,然後是一段2,依此類推,那麼現在問題來了,每一段的長度是多少呢?

如果我們令l[k]表示f數組中值爲k的一段的左邊界,r[k]表示f數組中值爲k的一段的有邊界,那麼有

·l[k] = r[k - 1] + 1,這是顯然的

·r[k] = max{i + nums[i] | l[k - 1] <= i <= r[k - 1]},由於f值爲k的位置一定是從f值爲k-1的位置走來的,所以只需要看從所有f值爲k-1的位置裏最遠可以到達的地方即可。

也就是說,我們可以在對nums的一遍掃描中,依次求出所有的l[k]和r[k],而f數組也就自然求解出來了——答案也就得到了。

【參考答案】

http://www.jiuzhang.com/solutions/jump-game-ii/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章