问题链接:Leetcode 55.跳跃游戏
Leetcode 55.跳跃游戏
问题描述
1、贪心
bool canJump(vector<int>& nums) { int len = nums.size(); // 数组长度 int far = 0; // 最远可到达位置(局部最优解)初始化 for(int i = 0; i < len; i++) { // 当前位置 i 在能走的最远可到达位置之内,说明当前位置可达 if(i <= far) { // 更新局部最优解 far = max(far, i + nums[i]); // 若局部最优解包含了最后位置,说明最后位置可达,直接返回 true if(far >= len - 1) return true; } } return false; }
2、回溯
bool canJumpHelper(vector<int>& nums, int len, int index) { // 每一次能走的最远距离受制于数组长度 int tmp = min(index + nums[index], len - 1); // 因为上面将最远距离限制在数组长度以内,所以这里的判定条件为 等于 而非 大于 if(tmp == len - 1) return true; // 穷尽当前位置上所有走法 for(int i = index + 1; i <= tmp; i++) { // 如果其中一个走法能到达数组最后位置,则返回 true,退出 if(canJumpHelper(nums, len, i)) return true; } // 穷尽所有走法依然无解,则返回 false,退出 return false; } bool canJump(vector<int>& nums) { int len = nums.size(); // 数组长度 return canJumpHelper(nums, len, 0); // 从索引 0 开始回溯 }
3、动态规划
a[i]={10a[j]==1 && j+nums[j]>=i, j<ielsebool canJump(vector<int>& nums) { // 声明 dp 数组,用于存储当前位置是否可达 并 初始化第一个位置为可达 vector<bool> dp(len, false); dp[0] = true; for(int i = 1; i < len; i++) { for(int j = i - 1; j >= 0; j--) { // 状态转移方程:如果 i 之前的某个位置 j 可达,并且从位置 j 可跳到当前位置,则当前位置可达 if(dp[j] == true && j + nums[j] >= i) { dp[i] = true; // 只要知道一个可达信息就行了,不需要得到 i 之前元素到 i 的全部可达信息 // 故在此处直接退出当前循环 break; } } } return dp[len - 1]; }
4、总结
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算