LeetCode 三角形最小路径和(动态规划、递推)

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:
[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

思路分析:此题与杨辉三角的构造方法非常类似,杨辉三角,

到达triangle[row][col]可能的路径为triangle[row - 1][col - 1]和triangle[row - 1][col],
当row == col时,只有triangle[row - 1][col - 1]能够到达,
当col == 0时,只有triangle[row - 1][col]能够到达。

LeetCode 三角形最小路径和(动态规划、递推)_第1张图片
利用动态规划的思想triangle[row][col] += min(triangle[row - 1][col - 1], triangle[row - 1][col])
然后返回最后一行的最小值即可。

class Solution {
public:
	int minimumTotal(vector>& triangle) {
		int rowSize = triangle.size();
		if (rowSize == 0) {
			return 0;
		}
		int colSize = triangle[0].size();
		for (int row = 1; row < rowSize; ++row) {//对每一行进行动态规划
			triangle[row][0] += triangle[row - 1][0];//当col为零
			for (int col = 1; col < row; ++col) {//动态规划中间的
				triangle[row][col] += min(triangle[row - 1][col - 1], triangle[row - 1][col]);
			}
			triangle[row][row] += triangle[row - 1][row - 1];//当row == col时
		}
		return *min_element(triangle[rowSize - 1].begin(), triangle[rowSize - 1].end());//返回最后一行的最小值
	}
};

LeetCode 三角形最小路径和(动态规划、递推)_第2张图片
此种方法的副作用就是改变了原来的triangle数据。(时间复杂度为O(n2), 空间复杂度为O(n2)(虽说是在原来的triangle空间上改,但毕竟是借用了))
其实也可以将它改成递推算法。

class Solution {
public:
	int minimumTotal(vector>& triangle) {
		int rowSize = triangle.size();
		if (rowSize == 0) {
			return 0;
		}
		int colSize = triangle[0].size();
        vector result = triangle[0];//到达i-1行各个位置的最小值
        vector tempRes;//到达i行的各个位置的最小值
		for (int row = 1; row < rowSize; ++row) {//对每一行进行迭代
            tempRes = vector (row + 1);//重新构造tempRes
			tempRes[0] = triangle[row][0] + result[0];//当col为零
			for (int col = 1; col < row; ++col) {//动态规划中间的
				tempRes[col] = triangle[row][col] + min(result[col - 1], result[col]);
			}
			tempRes[row] = triangle[row][row] + result[row - 1];//当row == col时
            result = tempRes;//将i-1行更新为i行,再次进行下一次的迭代
		}
		return *min_element(result.begin(), result.end());//返回最后一行的最小值
	}
};

LeetCode 三角形最小路径和(动态规划、递推)_第3张图片
此迭代法的时间复杂度为O(n2),额外的空间复杂度为O(n)。

你可能感兴趣的:(LeetCode)