Triangle

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

自顶向下做的,以前做过。关键min_paths[i][j] = min(min_paths[i-1][j-1],min_paths[i-1][j])+triangle[i][j];

然后是处理边界,以前感觉处理不是很好,此处一次AC。发现终于提高了不少。(no bug ,one pass 终极目标。。。)

此题若采用自底向上,那就容易多了,没有边界处理!详见Triangle

int minimumTotal(vector<vector<int> > &triangle) 
    {
    	vector<vector<int>> min_paths(triangle.size(),vector<int>(triangle.size()));
     
    	min_paths[0][0] = triangle[0][0];
    
    	for (int i = 1; i < triangle.size();i++)
    	{
    		min_paths[i][0] = min_paths[i-1][0] + triangle[i][0];//处理第0列的边界
    
    		min_paths[i][i] = min_paths[i-1][i-1] + triangle[i][i];//处理对角线边界
    	}
    	
    	for (int i = 1;i < triangle.size();i++)
    	{
    		for (int j = 1;j < i;j++)
    		{
    			min_paths[i][j] = min(min_paths[i-1][j-1],min_paths[i-1][j])+triangle[i][j];
    		}
    	}
    	
    	//寻找最小值
    	int min_val = min_paths[triangle.size()-1][0];
    
    	for (int i = 1; i < triangle.size();i++)
    	{
    		min_val = min_val < min_paths[triangle.size()-1][i]?min_val:min_paths[triangle.size()-1][i];
    	}
    	
    	return min_val;
     }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值