LeetCode OJ:Triangle

2014-11-24 08:16:04 · 作者: · 浏览: 0

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.

1、最简单的方法,通过递归求解,不过超时

class Solution{
public:
	void dfs(int row,int col,vector
  
   > &triangle,int sum,int &minT){
		if(row>=triangle.size()-1){
			minT=minT>sum sum:minT;
			return;
		}
		dfs(row+1,col,triangle,sum+triangle[row+1][col],minT);
		dfs(row+1,col+1,triangle,sum+triangle[row+1][col+1],minT);
	}
	int minimumTotal(vector
   
    > &triangle){ if(!triangle.size())return 0; int minT=INT_MAX; dfs(0,0,triangle,triangle[0][0],minT); return minT; } };
   
  

2、可以尝试递归+纪录路径的方法,不知道时间超不超时,不过空间复杂度要比O(n)多了;

3、动态规划,设dp[row][col]代表dao第row行第col列的最小值,则有dp[row][col]=min{dp[row-1][col-1],dp[row-1][col]}+triangle[row][col];AC了,但空间复杂度大于O(n)

class Solution{
public:
	int minimumTotal(vector
  
   > &triangle){
		if(!triangle.size())return 0;
		vector
   
    > dp(triangle); int minT=INT_MAX; dp[0][0]=triangle[0][0]; for(int i=1;i
    
     
4、动态规划,根据3可以将二维数组变为一维数组来处理,但是j就不能从0开始遍历了,得从后向前遍历

class Solution{
public:
	int minimumTotal(vector
      
       > &triangle){
		if(!triangle.size())return 0;
		vector
       
         dp(triangle.size()); int minT=INT_MAX; dp[0]=triangle[0][0]; for(int i=1;i
        
         =0;j--){ if(j==0)dp[j]+=triangle[i][j]; else if(j==i)dp[j]=dp[j-1]+triangle[i][j]; else dp[j]=min(dp[j],dp[j-1])+triangle[i][j]; } } for(int i=0;i