力扣labuladong一刷day61天动态规划最小下降路径

力扣labuladong一刷day61天动态规划最优子结构

一、931. 下降路径最小和

题目链接:https://leetcode.cn/problems/minimum-falling-path-sum/description/
如下图所示,求最小下降路径,定义dp[i][j]表示从最上面那行的任意位置抵达到nums[i][j]这个位置的最小路径和。根据题意每个位置只能从它上一行中的正上方的3个位置中得来,递推公式为dp[i][j]=min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1])+nums[i][j],因为是下降路径,遍历顺序自然是从上往下,从左往右,没啥限制每个节点都得遍历,时间复杂度为n2。可以不new新的dp数组,直接在nums上做运算,空间复杂度1。
力扣labuladong一刷day61天动态规划最小下降路径_第1张图片

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int len = matrix.length, max = Integer.MAX_VALUE;
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                int left = j-1>=0 ? matrix[i-1][j-1]:max;
                int mid = matrix[i-1][j];
                int right = j+1<len ? matrix[i-1][j+1]:max;
                matrix[i][j] = Math.min(Math.min(left, mid), right) + matrix[i][j];
            }
        }
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < len; i++) {
            min = Math.min(min, matrix[len-1][i]);
        }
        return min;
    }
}

你可能感兴趣的:(力扣算法题,leetcode,动态规划,算法)