关闭

Triangle

62人阅读 评论(0) 收藏 举报
分类:

方法1:dfs,时间复杂度是指数,排除

方法2:采用有向图求最短路径的方法,每个元素是一个节点,边的权值等于两个节点的值的和,把所有元素用邻接表存起来,设三角形最后一行有c个数,那么分别以这c个数作为路径寻找的终点,做c次dijkstra,得到c个最短路径,再在c个最短路径中找一个最小的,这个最小的值就是答案,这种方法的时间复杂度是O(cn),就是操作起来太麻烦。

方法3:动态规划,dp数组用了额外的O(n)的空间,时间复杂度O(n),扫描一次就得到了所有的c个结果,比上一个方法好太多了,进一步优化,由于递推式为f(i, k) = min{f(i-1,k),  f(i-1,k-1)} + d(i, k),f(i,k)表示到第i层的第k个顶点的最小路径长度,d(i, k)表示原来三角形数组里的第i行第k列的元素,那么可以直接用triangle数组存递推的结果,代码如下:

class Solution {
public:
	int minimumTotal(vector<vector<int> > &triangle) {
		int length = triangle.size();
		if (length == 0) {
			return 0;
		}

		int i, j;
		for (i = 1; i<length; i++) {
			int length_inner = triangle[i].size();
			//每一行中的第一和最后一个元素在上一行中只有一个邻居。而其他中间的元素在上一行中都有两个相邻元素
			for (j = 0; j<length_inner; j++) {
				if (j == 0) {
					triangle[i][j] = triangle[i][j] + triangle[i - 1][j];
				}
				else if (j == length_inner - 1) {
					triangle[i][j] = triangle[i][j] + triangle[i - 1][j - 1];
				}
				else {
					triangle[i][j] = (triangle[i][j] + triangle[i - 1][j - 1] < triangle[i][j] + triangle[i - 1][j] ? triangle[i][j] + triangle[i - 1][j - 1] : triangle[i][j] + triangle[i - 1][j]);
				}
			}
		}
		int min_path = triangle[length - 1][0];
		for (i = 1; i<triangle[length - 1].size(); i++) {
			min_path = (min_path < triangle[length - 1][i] ? min_path : triangle[length - 1][i]);
		}
		return min_path;
	}
};




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16664次
    • 积分:1729
    • 等级:
    • 排名:千里之外
    • 原创:160篇
    • 转载:17篇
    • 译文:3篇
    • 评论:1条
    文章分类