LeetCode——1824. 最少侧跳次数[Minimum Sideway Jumps][中等]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 动态规划(二维数组)
      • (1)思路
      • (2)代码
      • (3)结果
    • 2. 动态规划(一维数组)
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给你一个长度为 n 的 3 跑道道路 ,它总共包含 n + 1 个 点 ,编号为 0 到 n 。一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n 处。然而道路上可能有一些障碍。

给你一个长度为 n + 1 的数组 obstacles ,其中 obstacles[i] (取值范围从 0 到 3)表示在点 i 处的 obstacles[i] 跑道上有一个障碍。如果 obstacles[i] == 0 ,那么点 i 处没有障碍。任何一个点的三条跑道中 最多有一个 障碍。

  • 比方说,如果 obstacles[2] == 1,那么说明在点 2 处跑道 1 有障碍。

这只青蛙从点 i 跳到点 i + 1 且跑道不变的前提是点 i + 1 的同一跑道上没有障碍。为了躲避障碍,这只青蛙也可以在 同一个 点处 侧跳 到 另外一条 跑道(这两条跑道可以不相邻),但前提是跳过去的跑道该点处没有障碍。

  • 比方说,这只青蛙可以从点 3 处的跑道 3 跳到点 3 处的跑道 1 。

这只青蛙从点 0 处跑道 2 出发,并想到达点 n 处的 任一跑道 ,请你返回 最少侧跳次数 。

注意:点 0 处和点 n 处的任一跑道都不会有障碍。

示例 1:

输入:obstacles = [0,1,2,3,0]
输出:2
解释:总共有 2 次侧跳。
注意,这只青蛙只有当侧跳时才可以跳过障碍。

示例 2:

输入:obstacles = [0,1,1,3,3,0]
输出:0
解释:跑道 2 没有任何障碍,所以不需要任何侧跳。

示例 3:

输入:obstacles = [0,2,1,0,3,0]
输出:2
解释:最优方案总共有 2 次侧跳。

提示:

  • obstacles.length == n + 1
  • 1 <= n <= 5 * 10^5
  • 0 <= obstacles[i] <= 3
  • obstacles[0] == obstacles[n] == 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-sideway-jumps
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 动态规划(二维数组)

(1)思路

设计一个二维数组 dp[i][j],表示跳到位置为 i 的第 j + 1 条跑道时所需的最小侧跳次数,结合动态规划方法求解。

(2)代码

class Solution {public int minSideJumps(int[] obstacles) {int n = obstacles.length - 1, num = n + 2;int[][] dp = new int[n + 1][3];//动态规划数组for (int i = 0; i <= n; i++)for (int j = 0; j < 3; j++)dp[i][j] = num;dp[0][0] = 1;dp[0][1] = 0;dp[0][2] = 1;for (int i = 1; i <= n; i++) {if (obstacles[i] == 1) {//第一条跑道有障碍dp[i][1] = Math.min(dp[i - 1][1], dp[i - 1][2] + 1);dp[i][2] = Math.min(dp[i - 1][2], dp[i - 1][1] + 1);} else if (obstacles[i] == 2) {//第二条跑道有障碍dp[i][0] = Math.min(dp[i - 1][0], dp[i - 1][2] + 1);dp[i][2] = Math.min(dp[i - 1][2], dp[i - 1][0] + 1);} else if (obstacles[i] == 3) {//第三条跑道有障碍dp[i][0] = Math.min(dp[i - 1][0], dp[i - 1][1] + 1);dp[i][1] = Math.min(dp[i - 1][1], dp[i - 1][0] + 1);} else {//所有跑道无障碍dp[i][0] = Math.min(dp[i - 1][0], Math.min(dp[i - 1][1] + 1, dp[i - 1][2] + 1));dp[i][1] = Math.min(dp[i - 1][1], Math.min(dp[i - 1][0] + 1, dp[i - 1][2] + 1));dp[i][2] = Math.min(dp[i - 1][2], Math.min(dp[i - 1][0] + 1, dp[i - 1][1] + 1));}}return Math.min(dp[n][0], Math.min(dp[n][1], dp[n][2]));}
}

(3)结果

执行用时 :84 ms,在所有 Java 提交中击败了 38.20% 的用户;
内存消耗 :94.3 MB,在所有 Java 提交中击败了 79.32% 的用户。

2. 动态规划(一维数组)

(1)思路

上述求解过程中,在位置 i 各跑道的最小侧跳次数仅与位置 i - 1 的状态有关,因此可用一维数组替代。

(2)代码

class Solution {public int minSideJumps(int[] obstacles) {int n = obstacles.length - 1, num = n + 2;int[] dp = new int[3];//动态规划数组dp[0] = 1;dp[1] = 0;dp[2] = 1;for (int i = 1; i <= n; i++) {int[] lastDp = Arrays.copyOf(dp, dp.length);Arrays.fill(dp, num);if (obstacles[i] == 1) {//第一条跑道有障碍dp[1] = Math.min(lastDp[1], lastDp[2] + 1);dp[2] = Math.min(lastDp[2], lastDp[1] + 1);} else if (obstacles[i] == 2) {//第二条跑道有障碍dp[0] = Math.min(lastDp[0], lastDp[2] + 1);dp[2] = Math.min(lastDp[2], lastDp[0] + 1);} else if (obstacles[i] == 3) {//第三条跑道有障碍dp[0] = Math.min(lastDp[0], lastDp[1] + 1);dp[1] = Math.min(lastDp[1], lastDp[0] + 1);} else {//所有跑道无障碍dp[0] = Math.min(lastDp[0], Math.min(lastDp[1] + 1, lastDp[2] + 1));dp[1] = Math.min(lastDp[1], Math.min(lastDp[0] + 1, lastDp[2] + 1));dp[2] = Math.min(lastDp[2], Math.min(lastDp[0] + 1, lastDp[1] + 1));}}return Math.min(dp[0], Math.min(dp[1], dp[2]));}
}

(3)结果

执行用时 :47 ms,在所有 Java 提交中击败了 64.84% 的用户;
内存消耗 :126 MB,在所有 Java 提交中击败了 13.33% 的用户。

三、其他

暂无。

LeetCode——1824. 最少侧跳次数(Minimum Sideway Jumps)[中等]——分析及代码(Java)相关推荐

  1. LeetCode 1824. 最少侧跳次数(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 n 的 3 跑道道路 ,它总共包含 n + 1 个 点 ,编号为 0 到 n . 一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n ...

  2. LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)

    LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...

  3. LeetCode——1888. 使二进制字符串字符交替的最少反转次数(Minimum Number of Flips to Make the Binary ...)[中等]——分析及代码(Java)

    LeetCode--1888. 使二进制字符串字符交替的最少反转次数[Minimum Number of Flips to Make the Binary String Alternating][中等 ...

  4. LeetCode——5814. 新增的最少台阶数(Add Minimum Number of Rungs)[中等]——分析及代码(Java)

    LeetCode--5814. 新增的最少台阶数[Add Minimum Number of Rungs][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 模拟 + 贪心 (1)思路 ...

  5. LeetCode——909. 蛇梯棋(Snakes and Ladders)[中等]——分析及代码(Java)

    LeetCode--909. 蛇梯棋[Snakes and Ladders][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 广度优先搜索 (1)思路 (2)代码 (3)结果 三.其 ...

  6. LeetCode——1834. 单线程 CPU(Single-Threaded CPU)[中等]——分析及代码(Java)

    LeetCode--1834. 单线程 CPU[Single-Threaded CPU][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 优先队列 (1)思路 (2)代码 (3)结果 ...

  7. LeetCode——1947. 最大兼容性评分和(Maximum Compatibility Score Sum)[中等]——分析及代码(Java)

    LeetCode--1947. 最大兼容性评分和[Maximum Compatibility Score Sum][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 状态压缩 + 动态 ...

  8. LeetCode—5757. 矩阵中最大的三个菱形和(Get Biggest ...)[中等]—分析及代码(Java)

    LeetCode--5757. 矩阵中最大的三个菱形和[Get Biggest Three Rhombus Sums in a Grid][中等]--分析及代码[Java] 一.题目 二.分析及代码 ...

  9. LeetCode——1849. 将字符串拆分为递减的连续值(Splitting a String Into Descending Consecutive Val..)[中等]——分析及代码(Java)

    LeetCode--1849. 将字符串拆分为递减的连续值[Splitting a String Into Descending Consecutive Values][中等]--分析及代码[Java ...

最新文章

  1. 谨慎使用PHP的引用
  2. qtiplot编译失败linux,在macOS上安装 qtiplot 免费版
  3. 中国医科大学计算机应用基础本科在线作业,中国医科大学《计算机应用基础(本科)》在线作业.doc...
  4. 要的需求 ip提取网站源码带采集 要求是PHP源码
  5. datetime 日期_用Hamcrest验证DateTime和日期
  6. xshell 6 连接debian系统拒绝了密码_原来连接Linux,还有这个方法
  7. Github | Facebook人工智能实验室出品Pythia模块框架
  8. 百度题库西安交大程序C语言,程序设计基础试题(西安交大).doc
  9. atitit.印度教与java宗教的特点与观念对比 attilax总结
  10. 牛客网OI题:序列划分
  11. 不登陆QQ也能使用QQ截图工具
  12. 机器人读懂人心的九大模型
  13. 宝宝湿疹怎么办?宝宝湿疹怎么处理最好?
  14. 数字逻辑——七段数码管
  15. js清空浏览器cokie缓存_JS实现清除指定cookies的方法
  16. Meta Learning在NLP领域的应用
  17. matlab p文件转码 matlab pcode文件 将matlab中的p文件转为m文件工具
  18. java小游戏-超级玛丽
  19. 阿里巴巴数字化运营能力
  20. gitlab-ci配置详解(一)

热门文章

  1. C# windows服务:创建Windows服务(Windows Services)的一般步骤
  2. warning:suggest parentheses around assignment used as truth value
  3. Google 搜索的运作方式
  4. js原生写时间日期选择
  5. IIS如何设置默认访问https
  6. 天翼云赋能工业行业 安全上云更有保障
  7. php环境搭建(亲测可用)
  8. macOS Command - xattr
  9. 垃圾分类查询小程序(可回收物、有害垃圾、干垃圾、湿垃圾)
  10. {转}一位北京差生9年的北京生活