跳跃数组
原题在这里:
概述题意:
给定数组num,num[i]表示可以从i开始转移到下一个num数组下标的范围,问能否达到最后一个下标。
理所应当的,很自然的,我想到了dfs
但是dfs效率不高,所以还是写了剪枝——vis标记数组去重。
class Solution { int l; vector<int> vis, num; void dfs(int x) { if (x >= l) { vis[l - 1] = 1; return; } if (vis[x]) return; vis[x] = 1; for (int i = num[x]; i > 0; --i) if (!vis[l - 1]) dfs(x + i); } public: bool canJump(vector<int> &nums) { num = nums, l = nums.size(); vis = vector<int>(l, 0); dfs(0); return vis[l - 1] == 1; } };
论高效率还是得动态规划O(N)
analyse:
因为考虑的是最长能到达的下标,有num[i]跳跃距离为[i,i+num[i]],
所以考虑维护一下最长可到达的下标ans,一次遍历数组即可
遍历条件即为i<=ans&&i<num.size()
code:
class Solution { public: bool canJump(vector<int> &nums) { int l = nums.size(), ans = 0; for (int i = 0; i <= ans && i < l; ++i) ans = max(ans, i + nums[i]); return ans >= l - 1; } };
【Over】

浙公网安备 33010602011771号