給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。
示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/jump-game-ii
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
————————————
解題思路:
(1)使用貪心算法;
(2)使用max_pos保存當前步所能到達的最遠距離,比如例子中的nums[0]表示從index=0的位置所能到達的最遠距離爲index=2,這時候走了一步,使用step記錄走的步數,step=1;
(3)在nums[1-2]的距離內,記錄在num[1-2]所能到達的最遠距離,由例子可以知道,nums[1-2]能到達的最遠距離爲index=4,也就是到達index=4的位置所需要的最少步數爲step=2;因爲index=4爲數組的最後一位,因此可以返回2作爲結果;
其Python3代碼如下:
# Python3
class Solution:
def jump(self, nums: List[int]) -> int:
n = len(nums)
# maxPos用於保存當前nums[,end]所能到達的最遠距離;
# step用於記錄最大步數
maxPos, end, step = 0, 0, 0
for i in range(n - 1):
# end是當前step的最遠距離
if i <= end:
# 更新當前nums[:end]可以到達的最遠距離maxPos
maxPos = max(maxPos, i + nums[i])
# 當到達邊界,則更新下一步的邊界,並更新步數
if i == end:
end = maxPos
step += 1
return step
其C++代碼如下:
class Solution {
public:
int jump(vector<int>& nums)
{
int length = nums.size();
int max_pos = 0;
int end = 0;
int time = 0;
for(int i=0;i<length-1;++i)
{
if(i<=end)
{
max_pos = max(max_pos,nums[i]+i);
if(i==end)
{
end = max_pos;
time++;
}
}
}
return time;
}
};
代碼時間複雜度爲O(n),n爲數組長度;空間複雜度爲O(1);