相對與之前的跳躍遊戲,這道題目保證能夠抵達終點,但是要求你輸出最短路徑。
dp三部曲,定義子問題,定義狀態陣列,和狀態轉移方程。
下面就是最初版的**
// 90 / 92 個通過測試用例
class solution1 }}
return dp[nums.size()-1];
}};
雖然**正確,也能得到正確的結果,但是超時了,卡在了乙個全為1的輸入中。
優化下**:外層依舊遍歷整個陣列,內層迴圈則是遍歷當前陣列能夠抵達的位置, 更改其最小步數。
也就是狀態轉移方程變成了dp[i+j] = min(dp[i+j], dp[i]+1);
這就保證了對於全為1的陣列,內層迴圈只會走一步,就避免了之前的情況。
class solution2
}return dp[nums.size()-1];
}};
當我滿懷信心執行**的時候,結果還是超時了。
原來輸入中,還有乙個單調遞減的情況,導致最終內層迴圈次數分別為n,n-1,n-2...1位置,導致許多不必要的運算。
繼續優化:我們新增乙個變數,farthest,表示每次能夠抵達的最遠距離。如果不能保證當前位置能夠比farthest走的更遠的時候, 就說明當前位置不夠好。
同時,在內層迴圈之前,我們先判斷當前位置是否能夠直接抵達終點,如果可以就直接返回結果。
class solution
farthest = i + nums[i];
}return dp[num_len-1];
}};
繼續優化: 我們內層迴圈每次也不是需要從當前的下乙個位置開始更新,而是farthest-i開始,因為next=i+j = i+farthest-i+j = farthest, 即我們從之前所能抵達最遠位置開始更新,一直更新到當前所能抵達最遠位置。
class solution
farthest = i + nums[i];
}return dp[num_len-1];
}};
最後的**提交之後執行速度是4ms。
同樣是兩層迴圈,通過剪枝能夠大大提高運算速度。
力扣演算法題 045跳躍遊戲二
1 include 000庫函式.h 2 34 考慮當前最遠能到什麼地方,例如2,3,1,1,4,5 首先只考慮a 0 2,即最遠可以到a 2 然後從1到2中找下乙個可到的最遠點,6 即a 1 可以到達a 4 此時找到結果,步數記錄為2。若接著考慮,7 下一次應該從3 4裡面找乙個最遠即a 4 可達...
LeetCode 跳躍遊戲
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出 fa...
leetcode 跳躍遊戲
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例二 輸入 ...