1824.最少侧跳次数
链接:1824.最少侧跳次数
难度:Medium
标签:贪心、数组、动态规划
简介:这只青蛙从点 0 处跑道 2 出发,并想到达点 n 处的 任一跑道 ,请你返回 最少侧跳次数 。
题解 1 - rust
- 编辑时间:2023-01-21
- 执行用时:100ms
- 内存消耗:30.7MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
pub fn min_side_jumps(obstacles: Vec<i32>) -> i32 {
let n = obstacles.len();
let mut dp = vec![vec![0x3f3f3f3f; 4]; n];
dp[0][1] = 1;
dp[0][2] = 0;
dp[0][3] = 1;
for i in 1..n {
if obstacles[i] != 1 {
dp[i][1] = dp[i - 1][1];
}
if obstacles[i] != 2 {
dp[i][2] = dp[i - 1][2];
}
if obstacles[i] != 3 {
dp[i][3] = dp[i - 1][3];
}
if obstacles[i - 1] == 1 {
dp[i][1] = dp[i][2].min(dp[i][3]) + 1;
}
if obstacles[i - 1] == 2 {
dp[i][2] = dp[i][1].min(dp[i][3]) + 1;
}
if obstacles[i - 1] == 3 {
dp[i][3] = dp[i][1].min(dp[i][2]) + 1;
}
}
dp[n - 1][1].min(dp[n - 1][2]).min(dp[n - 1][3])
}
}
题解 2 - python
- 编辑时间:2023-01-21
- 执行用时:1964ms
- 内存消耗:88MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
def minSideJumps(self, obstacles: List[int]) -> int:
n = len(obstacles)
dp = [[0x3f3f3f3f for _ in range(4)] for _ in range(n)]
dp[0][2] = 0
dp[0][1] = dp[0][3] = 1
for i in range(1, n):
if obstacles[i] != 1:
dp[i][1] = dp[i - 1][1]
if obstacles[i] != 2:
dp[i][2] = dp[i - 1][2]
if obstacles[i] != 3:
dp[i][3] = dp[i - 1][3]
if obstacles[i - 1] == 1:
dp[i][1] = min(dp[i][2], dp[i][3]) + 1
if obstacles[i - 1] == 2:
dp[i][2] = min(dp[i][1], dp[i][3]) + 1
if obstacles[i - 1] == 3:
dp[i][3] = min(dp[i][1], dp[i][2]) + 1
return min(dp[n - 1][1], dp[n - 1][2], dp[n - 1][3])
题解 3 - cpp
- 编辑时间:2023-01-21
- 执行用时:584ms
- 内存消耗:313.1MB
- 编程语言:cpp
- 解法介绍:dp。
#define MAX 0x3f3f3f3f
class Solution {
public:
int minSideJumps(vector<int>& obstacles) {
int n = obstacles.size();
vector<vector<int>> dp(n, vector<int>(4, MAX));
dp[0][2] = 0;
dp[0][1] = dp[0][3] = 1;
for (int i = 1; i < n; i++) {
if (obstacles[i] != 1) dp[i][1] = dp[i - 1][1];
if (obstacles[i] != 2) dp[i][2] = dp[i - 1][2];
if (obstacles[i] != 3) dp[i][3] = dp[i - 1][3];
if (obstacles[i - 1] == 1) dp[i][1] = min(dp[i][2], dp[i][3]) + 1;
if (obstacles[i - 1] == 2) dp[i][2] = min(dp[i][1], dp[i][3]) + 1;
if (obstacles[i - 1] == 3) dp[i][3] = min(dp[i][1], dp[i][2]) + 1;
}
return min({dp[n - 1][1], dp[n - 1][2], dp[n - 1][3]});
}
};