题目描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
这其实就是一个利用局部最优解慢慢搜索到全局最优解的过程,用贪心算法。
解释如下:
我们选择从红色箭头最远的起点那个位置作为当前位置的下一跳位置,这是局部跳到最远的算法,将该算法扩展至全部结果仍然成立,这样得到的跳跃步数即为最小跳跃数。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
int jump(vector<int>& nums){
if(nums.size() == 1) return 0;
int bump_cnt = 0; //跳跃次数
int curr_bump_dis = nums[0]; //当前可以跳跃的最大距离
int curr_select_index = 0; //当前坐标
int max_bump_dis; //目前能到达的最大距离
int len = nums.size();
for(int i = 0; i < len;){
if(i + curr_bump_dis >= len - 1) return ++bump_cnt;
max_bump_dis = 0;
for(int j = i + 1; j <= i + curr_bump_dis && j < len; j++){
if(j + nums[j] > max_bump_dis){
max_bump_dis = j + nums[j];
curr_select_index = j;
}
}
curr_bump_dis = nums[curr_select_index];
i = curr_select_index;
bump_cnt++;
}
return bump_cnt;
}
int main(){
vector<int> vec;
int n;
while(cin>>n){
vec.push_back(n);
}
cout<<jump(vec)<<endl;
return 0;
}
题目来自leetcode,点击题目描述即可跳转到题目页面