[LeetCode] 55. Jump Game 解题思路
2015-12-28 08:39
225 查看
Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A =
A =
问题:给定一个数字,假设你站在第一个元素,每个元素表示你可以跳得最大距离。求你是否可以跳到最后一个元素。
思路一,假设已知 A[i+1...n] 是否可以跳都终点(最后一个元素),则 A[i] 是否可以跳到终点只需要检查 A[i+k] 是否可以跳到终点即可。
这实际是一个 DP 思路。对于每个 A[i] 都可能检查大概 (n-i) 次,时间复杂度为 O(n*n),超时。
思路二,结合思路一以及超时的 test case 发现,其实对于 A[i] 无需检查 k 次,只需要检查 A[i] 和右边最近的可达终点的元素的距离是否小于 A[i] 值即可。
v[i] 表示在 nums[i...n]中,nums[i] 到达下一个可达终点元素的距离。
例如,nums[i]自身可达终点,则v[i] = 0;nums[i]不可达而nums[i+1]可达,则 v[i] = 1;nums[i]不可达而nums[i+k]才可达,则v[i] = k;
借组辅助表格 v ,A[i] 只需要检查 v[i+1] 是否小于 A[i] 就可以知道 A[i] 是否可达终点。
元素是否可达终点,所以只需要判断 A[i] 的最大可跳距离是否大于最近可行元素即可,最近可行元素之后的情况无需考虑。思路二 实际就是贪心思路(Greedy),题目也是归类到 Greedy 下面的,吻合。
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A =
[2,3,1,1,4], return
true.
A =
[3,2,1,0,4], return
false.
问题:给定一个数字,假设你站在第一个元素,每个元素表示你可以跳得最大距离。求你是否可以跳到最后一个元素。
思路一,假设已知 A[i+1...n] 是否可以跳都终点(最后一个元素),则 A[i] 是否可以跳到终点只需要检查 A[i+k] 是否可以跳到终点即可。
这实际是一个 DP 思路。对于每个 A[i] 都可能检查大概 (n-i) 次,时间复杂度为 O(n*n),超时。
思路二,结合思路一以及超时的 test case 发现,其实对于 A[i] 无需检查 k 次,只需要检查 A[i] 和右边最近的可达终点的元素的距离是否小于 A[i] 值即可。
v[i] 表示在 nums[i...n]中,nums[i] 到达下一个可达终点元素的距离。
例如,nums[i]自身可达终点,则v[i] = 0;nums[i]不可达而nums[i+1]可达,则 v[i] = 1;nums[i]不可达而nums[i+k]才可达,则v[i] = k;
借组辅助表格 v ,A[i] 只需要检查 v[i+1] 是否小于 A[i] 就可以知道 A[i] 是否可达终点。
元素是否可达终点,所以只需要判断 A[i] 的最大可跳距离是否大于最近可行元素即可,最近可行元素之后的情况无需考虑。思路二 实际就是贪心思路(Greedy),题目也是归类到 Greedy 下面的,吻合。
bool canJump(vector<int>& nums) { if (nums.size() < 2) { return true; } vector<int> v(nums.size()); long len = nums.size(); if (nums[len - 2] > 0) { v[len - 2] = 0; }else{ v[len - 2] = 1; } for (int i = (int)nums.size()-3; i >= 0 ; i--) { if (nums[i] > v[i+1]) { v[i] = 0; }else{ v[i] = v[i+1] + 1; } } return (v[0] == 0) ? true : false; }
相关文章推荐
- 两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
- Mac OS X Cl Capitan 设置HOMEBREW_GITHUB_API_TOKEN
- UISearchDisplayController搜索栏控制器
- 网络情求
- vtkImageData转换成cv::Mat
- Fetch:下一代 Ajax 技术
- 建立链接
- sharesdk 实现三方登陆、分享及关注的功能
- c++变量的存储区域
- Valid Parentheses
- 发送cookie,以ip来限定点击量
- 分布式技术一周技术动态 2015.12.27
- SAP R3 新建库位 :配置路径:SPRO-企业结构-定义-物料管理-维护仓储地点。
- SAP R3 新建库位 :配置路径:SPRO-企业结构-定义-物料管理-维护仓储地点。
- SAP R3 新建库位 :配置路径:SPRO-企业结构-定义-物料管理-维护仓储地点。
- 在winserver 2012 R2 中创建常用的图标
- 上周热点回顾(12.21-12.27)
- LeetCode-22-Generate Parentheses(DFS/递归)-Medium
- android的显式提交和隐式提交
- 在 iOS9 中现在找不到 XXX.dylib 了,比如libz.tbd 如果要用到 libz.dylib,可以用下面的办法,来自 Stack Overflow。