LeetCode——1824. 最少侧跳次数(Minimum Sideway Jumps)[中等]——分析及代码(Java)
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)相关推荐
- LeetCode 1824. 最少侧跳次数(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 n 的 3 跑道道路 ,它总共包含 n + 1 个 点 ,编号为 0 到 n . 一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n ...
- LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)
LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...
- LeetCode——1888. 使二进制字符串字符交替的最少反转次数(Minimum Number of Flips to Make the Binary ...)[中等]——分析及代码(Java)
LeetCode--1888. 使二进制字符串字符交替的最少反转次数[Minimum Number of Flips to Make the Binary String Alternating][中等 ...
- LeetCode——5814. 新增的最少台阶数(Add Minimum Number of Rungs)[中等]——分析及代码(Java)
LeetCode--5814. 新增的最少台阶数[Add Minimum Number of Rungs][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 模拟 + 贪心 (1)思路 ...
- LeetCode——909. 蛇梯棋(Snakes and Ladders)[中等]——分析及代码(Java)
LeetCode--909. 蛇梯棋[Snakes and Ladders][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 广度优先搜索 (1)思路 (2)代码 (3)结果 三.其 ...
- LeetCode——1834. 单线程 CPU(Single-Threaded CPU)[中等]——分析及代码(Java)
LeetCode--1834. 单线程 CPU[Single-Threaded CPU][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 优先队列 (1)思路 (2)代码 (3)结果 ...
- LeetCode——1947. 最大兼容性评分和(Maximum Compatibility Score Sum)[中等]——分析及代码(Java)
LeetCode--1947. 最大兼容性评分和[Maximum Compatibility Score Sum][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 状态压缩 + 动态 ...
- LeetCode—5757. 矩阵中最大的三个菱形和(Get Biggest ...)[中等]—分析及代码(Java)
LeetCode--5757. 矩阵中最大的三个菱形和[Get Biggest Three Rhombus Sums in a Grid][中等]--分析及代码[Java] 一.题目 二.分析及代码 ...
- LeetCode——1849. 将字符串拆分为递减的连续值(Splitting a String Into Descending Consecutive Val..)[中等]——分析及代码(Java)
LeetCode--1849. 将字符串拆分为递减的连续值[Splitting a String Into Descending Consecutive Values][中等]--分析及代码[Java ...
最新文章
- 谨慎使用PHP的引用
- qtiplot编译失败linux,在macOS上安装 qtiplot 免费版
- 中国医科大学计算机应用基础本科在线作业,中国医科大学《计算机应用基础(本科)》在线作业.doc...
- 要的需求 ip提取网站源码带采集 要求是PHP源码
- datetime 日期_用Hamcrest验证DateTime和日期
- xshell 6 连接debian系统拒绝了密码_原来连接Linux,还有这个方法
- Github | Facebook人工智能实验室出品Pythia模块框架
- 百度题库西安交大程序C语言,程序设计基础试题(西安交大).doc
- atitit.印度教与java宗教的特点与观念对比 attilax总结
- 牛客网OI题:序列划分
- 不登陆QQ也能使用QQ截图工具
- 机器人读懂人心的九大模型
- 宝宝湿疹怎么办?宝宝湿疹怎么处理最好?
- 数字逻辑——七段数码管
- js清空浏览器cokie缓存_JS实现清除指定cookies的方法
- Meta Learning在NLP领域的应用
- matlab p文件转码 matlab pcode文件 将matlab中的p文件转为m文件工具
- java小游戏-超级玛丽
- 阿里巴巴数字化运营能力
- gitlab-ci配置详解(一)