一、矩阵的最小路径和
给定一个 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),需要一个二维数组来存储中间状态。

京公网安备 11010502036488号