我又懈怠了。。。新的一天重新刷题
关于跳跃游戏两则:
第一个是leetcode 55题
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
问题是判断,能否到达最后一个位置,那么只要我们跳跃的最大长度大于数组长度,那么就一定可以到达最后一个位置。
求解:
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 };