LeetCode解法汇总931. 下降路径最小和

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径  最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)(row + 1, col) 或者 (row + 1, col + 1) 。

示例 1:

LeetCode解法汇总931. 下降路径最小和_第1张图片

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:

LeetCode解法汇总931. 下降路径最小和_第2张图片

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

解题思路:

* 931. 下降路径最小和

* 解题思路:

* 广度搜索的方式。

* 构建一个同样大小的二维数组sum,存储该路径下可能的最小值。而下一行sum[y][x]位置的最小值,就是sum[y-1][x-1],sum[y-1][x],sum[y-1][x+1]三者的最小值加上自身。

* 最后,求出最后一行的最小值即可。

代码:

class Solution931
{
public:
    int minFallingPathSum(vector> &matrix)
    {

        vector> sum(matrix.size(), vector(matrix[0].size()));
        sum[0] = matrix[0];
        for (int y = 1; y < matrix.size(); y++)
        {
            for (int x = 0; x < matrix[0].size(); x++)
            {
                sum[y][x] = getMinValue(y - 1, x, sum) + matrix[y][x];
            }
        }
        int maxValue = 10000;
        for (int x = 0; x < sum[0].size(); x++)
        {
            maxValue = min(maxValue, sum[matrix.size() - 1][x]);
        }
        return maxValue;
    }

    int getMinValue(int y, int x, vector> &sum)
    {
        int minValue = sum[y][x];
        if (x > 0)
        {
            minValue = min(minValue, sum[y][x - 1]);
        }
        if (x < sum.size() - 1)
        {
            minValue = min(minValue, sum[y][x + 1]);
        }
        return minValue;
    }
};

你可能感兴趣的:(编程题,leetcode,算法,职场和发展)