博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode Jump Game
阅读量:5133 次
发布时间:2019-06-13

本文共 2969 字,大约阅读时间需要 9 分钟。

class Solution {public:    bool canJump(int A[], int n) {        if (A == NULL || n < 1) return false;        vector
sum(n, 0); int jump = A[n-1]; for (int i=n-2; i>=0; i--) { jump = A[i]; if (i + jump >= n - 1) { sum[i] = sum[i+1] + 1; continue; } int region = sum[i + 1] - sum[i + jump + 1]; sum[i] = sum[i+1] + (region > 0); } if (jump >= n-1) { return true; } else { return sum[0] - sum[jump] > 0; } }};

直接用dfs+记忆超时,关键在于判断从某一位置上进行的跳跃中,其范围内的这些位置中是否有可达终点的情况存在,用一个后缀和来表示,每发现一个可以达到终点的位置该位置的后缀和相比其他+1,这样可以通过将两个后缀和相减与0比较判断该范围内是否有可达终点的位置。

 

找到一个时间O(n)空间O(1)的方法,精妙许多

http://www.cnblogs.com/zhuli19901106/p/3568215.html

第二轮:

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 = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

只知道以前有看到过这么个思路,不过自己写的太烦了:

// 16:01class Solution {public:    bool canJump(vector
& nums) { int len = nums.size(); if (len < 2) { return true; } int last = 0; while (last < len) { int jmp = nums[last]; if (jmp == 0) { return false; } int jmax = 0; int jidx = last + 1; for (int i=1; i<=jmp; i++) { int idx = i + last; if (idx >= len - 1) { return true; } if (jmax < i + nums[idx]) { jmax = i + nums[idx]; jidx = idx; } } last = jidx; } return true; }};

自己也写个链接里的:

1 // 16:26 2 class Solution { 3 public: 4     bool canJump(vector
& nums) { 5 int len = nums.size(); 6 int jmp_far = 0; 7 int current = 0; 8 9 for (int i=0; i
= len - 1) {14 break;15 }16 jmp_far = max(i + nums[i], jmp_far);17 }18 return true;19 }20 };

 5.21 又一次,没有想到简单的,还是用了复杂的,不过也行

// 00:23class Solution {public:    bool canJump(vector
& nums) { int len = nums.size(); int si = 0; while (si < len) { int next = si; int far = si; int end = si + nums[si]; if (end >= len - 1) return true; for (int i=si+1; i<=end; i++) { if (nums[i] + i > far) { next = i; far = nums[i] + i; } } if (si == next) return false; si = next; } return si >= len; }};

 

转载于:https://www.cnblogs.com/lailailai/p/3849021.html

你可能感兴趣的文章
jQuery EasyUI 的下拉选择combobox后台动态赋值
查看>>
timeline时间轴进度“群英荟萃”
查看>>
python if else elif statement
查看>>
网络编程
查看>>
文本隐藏(图片代替文字)
查看>>
java面试题
查看>>
提高码力专题(未完待续)
查看>>
pair的例子
查看>>
前端框架性能对比
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>
同步代码时忽略maven项目 target目录
查看>>
Oracle中包的创建
查看>>
团队开发之个人博客八(4月27)
查看>>
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>