跳跃游戏1,2

我又懈怠了。。。新的一天重新刷题

关于跳跃游戏两则:

第一个是leetcode 55题

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 13 步到达最后一个位置。

问题是判断,能否到达最后一个位置,那么只要我们跳跃的最大长度大于数组长度,那么就一定可以到达最后一个位置。

求解:

 1 class Solution {
 2 public:
 3     bool canJump(vector<int>& nums) 
 4     {
 5         int n = nums.size();
 6         int longest= 0;
 7         for (int i = 0; i < n; ++i) 
 8         {
 9             if (i <= longest) 
10                 longest = max(longest, i + nums[i]);
11                 if (longest >= n - 1) 
12                     return true;
13         }
14         return false;
15     }
16 };

 

跳跃游戏2

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

不同点:保证能跳跃到最后一个位置,求最少的跳跃数

可以选择用动态规划,但是这里可以考虑一下贪心选择

如图所示,第一个位置0处,可以跳到0+1,0+2处,step+1; 当跳到0+1处,下一步可以跳到0+1++,0+1+2,0+1+3处, step+1; 每一次都判断能否到达最后一个位置,如果到达则return;

具体实现如下:

 1 class Solution {
 2 public:
 3     int jump(vector<int>& nums) {
 4         int steps = 0;
 5         int start = 0;
 6         int end = 0;
 7         while (end < nums.size()-1) {
 8             int max = end;
 9             for (int i = start; i <= end; i++) {//选一个最有潜力的
10                 if (nums[i]+i > max) {
11                     max = nums[i]+i;
12                 } 
13             }
14             start = end+1;
15             end = max;
16             steps++;
17         }
18         return steps;
19     }
20 };

 

posted @ 2020-11-12 12:13  Doris233  阅读(86)  评论(0编辑  收藏  举报