跳到主要内容

1289.下降路径最小和II

链接:1289.下降路径最小和II
难度:Hard
标签:数组、动态规划、矩阵
简介:给你一个 n x n 整数矩阵 grid ,请你返回 非零偏移下降路径 数字和的最小值。

题解 1 - cpp

  • 编辑时间:2023-08-10
  • 执行用时:40ms
  • 内存消耗:13.82MB
  • 编程语言:cpp
  • 解法介绍:遍历,只记录最小值和第二小值。
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& grid) {
int n = grid.size(), min1, min2, res;
auto refresh = [&](int row) {
res = INT_MAX;
min1 = INT_MAX;
min2 = INT_MAX;
for (int j = 0; j < n; j++) {
res = min(res, grid[row][j]);
if (min1 == INT_MAX || grid[row][j] < grid[row][min1]) min2 = min1, min1 = j;
else if (min2 == INT_MAX || grid[row][j] < grid[row][min2]) min2 = j;
}
};
for (int row = 1; row < n; row++) {
refresh(row - 1);
for (int j = 0; j < n; j++) {
grid[row][j] += j == min1 ? grid[row - 1][min2] : grid[row - 1][min1];
}
}
refresh(n - 1);
return res;
}
};

题解 2 - python

  • 编辑时间:2023-08-10
  • 执行用时:128ms
  • 内存消耗:18.97MB
  • 编程语言:python
  • 解法介绍:同上。
class Solution:
def minFallingPathSum(self, grid: List[List[int]]) -> int:
n = len(grid)
min1 = min2 = res = 0
def refresh(row: int):
nonlocal res
nonlocal min1
nonlocal min2
res = min1 = min2 = inf
for j in range(n):
res = min(res, grid[row][j])
if min1 == inf or grid[row][j] < grid[row][min1]:
min2 = min1
min1 = j
elif min2 == inf or grid[row][j] < grid[row][min2]:
min2 = j
for row in range(1, n):
refresh(row-1)
for j in range(n):
grid[row][j] += grid[row -
1][min2] if j == min1 else grid[row - 1][min1]
refresh(n-1)
return res

题解 3 - rust

  • 编辑时间:2023-08-10
  • 内存消耗:2.53MB
  • 编程语言:rust
  • 解法介绍:同上。
impl Solution {
pub fn min_falling_path_sum(mut grid: Vec<Vec<i32>>) -> i32 {
let n = grid.len();
let mut min1 = 0;
let mut min2 = 0;
for row in 1..n {
min1 = usize::MAX;
min2 = usize::MAX;
for j in 0..n {
if min1 == usize::MAX || grid[row - 1][j] < grid[row - 1][min1] {
min2 = min1;
min1 = j;
} else if min2 == usize::MAX || grid[row - 1][j] < grid[row - 1][min2] {
min2 = j;
}
}
for j in 0..n {
grid[row][j] += if j == min1 {
grid[row - 1][min2]
} else {
grid[row - 1][min1]
};
}
}
*grid[n - 1].iter().min().unwrap()
}
}