给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
贪心:
class Solution {
public:
int jump(vector<int>& nums) {
int maxPos = 0, n = nums.size(), end = 0, step = 0;
for (int i = 0; i < n - 1; ++i) {
if (maxPos >= i) { //maxPos为可走范围,只要i在可走范围内,就不停用最远值(maxPos)更新
maxPos = max(maxPos, i + nums[i]);
if (i == end) {
end = maxPos; //end为每轮找定最大值后的边界
++step;
}
}
}
return step;
}
};
动态规划:
class Solution {
public:
int jump(vector<int>& nums) {
vector<int> value;
vector<int> max;
for(int i=0;i<nums.size();i++){
// value[i]=1;
max.push_back(i+nums[i]);
if(i==0) value.push_back(0);
else value.push_back(999999);
}
for(int i=0;i<nums.size();i++){ //i每次与它前面的每个j比较大小
for(int j=0;j<i;j++){
if(i<=max[j]) value[i]=min(value[i],value[j]+1); //若比前面的某个数大,将value[j]+1与自己value[i]对比留大
}
}
return value[nums.size()-1];
}
};