一、矩阵的最小路径和

给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。

#include <algorithm>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& matrix) {
        // write code here
        int r = matrix.size();
        int c = matrix[0].size();
		//i行 j列
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if(i == 0 && j > 0){//最上边
                    matrix[i][j] += matrix[i][j-1];
                }else if (j == 0 && i > 0) {//最左边
                    matrix[i][j] += matrix[i-1][j];
                }else {
                    if (i==0 && j==0) {
                        continue;//起点
                    }
                    int min_path = std::min(matrix[i][j-1], matrix[i-1][j]);//前一行或者前一列的
                    matrix[i][j] += min_path;
                }
            }
        }
        return matrix[r-1][c-1];//路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
    }
};

基本算法思想:

动态规划。创建一个二维数组dp,dp[i][j]表示从起点到达坐标(i,j)的最小路径和。初始化dp[0][0]为matrix[0][0],然后遍历矩阵,对于每个位置(i,j),更新dp[i][j]为dp[i-1][j]和dp[i][j-1]中的较小值加上matrix[i][j]。最后返回dp[r-1][c-1]即为最小路径和。

时间复杂度:

O(r*c),其中r为矩阵的行数,c为矩阵的列数。

空间复杂度:

O(r*c),需要创建一个与矩阵大小相同的二维数组dp。

二、三角形最短路径和

给定一个正三角形数组,自顶到底分别有 1,2,3,4,5...,n 个元素,找出自顶向下的最小路径和。

每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点。

数据范围:三角形数组行数满足 1≤�≤200 1≤n≤200  ,数组中的值都满足 ∣���∣≤104 ∣val∣≤104 

#include <algorithm>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param triangle int整型vector<vector<>>
     * @return int整型
     */
    int minTrace(vector<vector<int> >& triangle) {
        // write code here
        vector<vector<int>> dp(triangle.size()+1,vector<int>(triangle.size()+1,0));
        //这个二维向量的大小是 triangle.size()+1,即 triangle 的大小加1。
        //每一个元素都是一个 vector<int>,它的大小也是 triangle.size()+1,每个元素初始化为 0。
        //i行 j列
        for (int i = triangle.size()-1; i >= 0; --i) {
            for (int j = 0; j <= i; ++j) {
                dp[i][j] = min(dp[i+1][j+1], dp[i+1][j]) + triangle[i][j];
                //比较当前格子 下面的格子 和 下面的右侧格子
            }
        }
        return dp[0][0];
    }
};

基本算法思想:

动态规划。从三角形的底部开始,每一层计算出从当前位置到底部的最小路径和,最终得到从顶部到底部的最小路径和。

时间复杂度:

O(n^2),其中 n 是三角形的行数。

空间复杂度:

O(n^2),需要一个二维数组来存储中间状态。