文章目录

  • [55. 跳跃游戏](https://leetcode-cn.com/problems/jump-game/)
  • [45. 跳跃游戏 II](https://leetcode-cn.com/problems/jump-game-ii/)
  • [1306. 跳跃游戏 III](https://leetcode-cn.com/problems/jump-game-iii/)
  • [1345. 跳跃游戏 IV](https://leetcode-cn.com/problems/jump-game-iv/)

55. 跳跃游戏

class Solution {public:bool canJump(vector<int>& nums) {// index记录当前可以往前走的最大长度,每跳一步index--if (nums.size() == 1) {return true;}int index = nums[0];for (int i = 1; i < nums.size(); i++) {if (index-- == 0) {return false;}index = max(index, nums[i]);}return true;}
};

45. 跳跃游戏 II

class Solution {public:int jump(vector<int>& nums) {int len = nums.size();vector<int> dp(len, len);dp[0] = 0;for (int i = 0; i < len; ++i) {for (int j = 0; j < i; ++j) {if (j + nums[j] >= i) {dp[i] = min(dp[i], dp[j] + 1);}}}return dp[len - 1];}
};
class Solution {public:int jump(vector<int>& nums) {int len = nums.size();int step = 0, maxpos = 0, end = 0;for (int i = 0; i < len; ++i) {if (maxpos < i) {return -1;}maxpos = max(i + nums[i], maxpos);if (i == end && i != len - 1) {++step;end = maxpos;} }return step;}
};

1306. 跳跃游戏 III

class Solution {public:vector<int> vis;bool flag = false;void dfs(vector<int>& arr, int idx) {if (vis[idx] || flag)    return;vis[idx] = 1;if (arr[idx] == 0)  {flag = true;return;}if (idx - arr[idx] >= 0)    dfs(arr, idx - arr[idx]);if (idx + arr[idx] < arr.size())    dfs(arr, idx + arr[idx]);}bool canReach(vector<int>& arr, int start) {int len = arr.size();vis.resize(len, 0);dfs(arr, start);return flag;}
};
class Solution {public:bool canReach(vector<int>& arr, int start) {// BFSint len = arr.size();vector<int> vis(len , 0);queue<int> q;q.push(start);vis[start] = 1;while (!q.empty()) {int temp = q.front();if (arr[temp] == 0) return true;q.pop();if (temp - arr[temp] >= 0 && !vis[temp - arr[temp]]) {q.push(temp - arr[temp]);vis[temp - arr[temp]] = 1;}if (temp + arr[temp] < len && !vis[temp + arr[temp]]) {q.push(temp + arr[temp]);vis[temp + arr[temp]] = 1;}}return false;}
};

1345. 跳跃游戏 IV

class Solution {public:int ret = INT_MAX;unordered_map<int, vector<int>> mp;vector<int> vis;void DFS(vector<int>& arr, int step, int idx) {if (idx == arr.size() - 1) {ret = min(ret, step);}if (step > ret || vis[idx] <= step) return;vis[idx] = step;for (int& x : mp[arr[idx]]) {if (x == idx)   continue;DFS(arr, step + 1, x);}if (idx + 1 < arr.size()) {DFS(arr, step + 1, idx + 1);}if (idx - 1 >= 0) {DFS(arr, step + 1, idx - 1);}}int minJumps(vector<int>& arr) {// 仿记忆化搜索,vis用来保存idx最小访问跳跃次数// 超时int len = arr.size();ret = min(ret, len);vis.resize(len, len);for (int i = 0; i < len; ++i) {mp[arr[i]].push_back(i);}DFS(arr, 0, 0);return ret;}
};

为什么只能用bfs不能用dfs:

虽然对DFS进行了优化,避免用数组记录访问的最小次数,当前step>min_step时退出,但显然step的减少速度比不上BFS中step+1快,所以超时,只能采用BFS

因为BFS的更新step是+1递增,所以可以避免许多重复的idx加入queue,但为了避免重复元素过多对map的访问超时,直接将map.clear()

class Solution {public:int minJumps(vector<int>& arr) {const int inf = 0x3f3f3f3f;int len = arr.size();unordered_map<int, vector<int>> mp;for (int i = len - 1; i >= 0; --i) {mp[arr[i]].push_back(i);}vector<int> dist(len, inf);queue<int> q;q.push(0);dist[0] = 0;while (!q.empty()) {int t= q.front();q.pop();if (t == len - 1) return dist[t];for (int& x : mp[arr[t]]) {if (dist[x] == inf) {dist[x] = dist[t] + 1;q.push(x);}}mp[arr[t]].clear();if (t + 1 < len && dist[t + 1] == inf) {q.push(t + 1);dist[t + 1] = dist[t] + 1;}if (t - 1 >= 0 && dist[t - 1] == inf) {q.push(t - 1);dist[t - 1] = dist[t] + 1;}}return -1;}
};

leetcode 跳跃游戏系列 c++相关推荐

  1. Leetcode跳跃游戏

    文章目录 Leetcode跳跃游戏 题目简介 跳跃游戏1 跳跃游戏2 Leetcode跳跃游戏 题目简介 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最 ...

  2. LeetCode(跳跃游戏)

    20200404 题目 :跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否可以到达最后的位置. 示例: 输入: [2,3,1 ...

  3. Leetcode 跳跃游戏

    跳跃游戏 题目描述: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个下标. 提示: 1 <= ...

  4. leetcode跳跃游戏C语言,LeetCode:跳跃游戏

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...

  5. leetcode——石子游戏系列题目

    石子游戏 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚历 ...

  6. leetcode:跳跃游戏 IV

    dijk 22/32 class Solution {public:int minJumps(vector<int>& arr) {// dijk? 最短路径?if(arr.siz ...

  7. 《LeetCode力扣练习》第55题 跳跃游戏 Java

    <LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...

  8. LeetCode:跳跃游戏【55】

    LeetCode:跳跃游戏[55] 题目描述 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个位置. 示例 1: 输入: ...

  9. LeetCode 55跳跃游戏56合并区间57插入区间

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

最新文章

  1. 深度解读Helm 3: 犹抱琵琶半遮面
  2. jupyter notebook上完美运行tensorflow、keras
  3. JavaWeb Cookie详解
  4. xMedia来了!支付宝客户端的智能化“武器”
  5. 你有一个向LiveVideoStackCon讲师提问的机会
  6. 「每天一道面试题」如何理解方法的重载与覆盖?
  7. 调整eclipse、SpringToolSuite4编辑器的内存大小以及显示
  8. java情人节_情人节写给女朋友Java Swing代码程序
  9. 容器编排技术 -- 使用kubectl实现应用滚动更新
  10. php购物车(session)
  11. 图解PostgreSQL进程结构和内存结构
  12. Python编写API接口
  13. updata pip 报错 TypeError: parse() got an unexpected keyword argument 'transport_encoding'
  14. JFLASH添加华大型号详细教程
  15. Pazera Free Audio Extractor 中文版 - 轻松将视频背景音乐/对话音频提取出来的免费软件...
  16. 风控ML[15] | 风控模型报告以及上线后需要监控的内容
  17. 2018-3-25至2018-8-9的日语笔记
  18. 微信内置浏览器如何自动跳转其它浏览器
  19. 配置apache支持django
  20. 感谢3亿人捐献330亿爱心,水滴筹创始人沈鹏身价或超100亿

热门文章

  1. MATLAB创建音乐《光年之外》
  2. 富受贿数额为45437元
  3. 电脑怎么进入linux系统,Linux系统怎么进入终端?三种方法帮你搞定!
  4. Vue.js中的v-model指令(双向绑定)
  5. java课程设计---绘图板
  6. 微信公众平台的基础对接
  7. echarts多线图表 提示框自定义
  8. BZOJ 1911 (APIO 2010) 特别行动队
  9. 常见Linux系统下载站
  10. 采用AT89C2051的智能时钟