120. Triangle

来源:互联网 发布:c语言二级考试选择题 编辑:程序博客网 时间:2024/06/05 09:30


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.

思路就是回溯,由下向上的回溯

上图的7就是min(4,1)+6

6就是min(1,8)+5

等等等。


代码如下:

import java.util.ArrayList;import java.util.List;/** * Created by kyle on 2016/6/24. */public class Triangle2 {    public static int minimumTotal(List<List<Integer>> triangle) {        int m = triangle.size();        int n = triangle.get(m-1).size();        int[][] result = new int[m][n];        if(m==0){            return 0;        }        if(m == 1){            return  triangle.get(0).get(0);        }        for(int j = 0 ;  j < triangle.get(m-1).size(); j++){            result[m-1][j] = triangle.get(m-1).get(j);        }        for(int i = m-2 ; i>=0 ; i--){            for(int j = 0; j <triangle.get(i).size(); j++ ){               result[i][j] = Math.min(result[i+1][j], result[i+1][j+1])                       +triangle.get(i).get(j);            }        }        return result[0][0];    }    public  static  void main(String[] args){        List<List<Integer>> lists = new ArrayList<>();        List<Integer> one = new ArrayList<Integer>();        one.add(1);        lists.add(one);        List<Integer> two = new ArrayList<Integer>();        two.add(2);        two.add(3);        lists.add(two);        System.out.println(minimumTotal(lists));    }}
上述方法空间复杂度O(n^2),时间复杂度也是O(n^2).如果可以修改triangle的话,空间复杂度可以降到O(1)。时间复杂度不知道有没有更优的解,如有知道,不吝赐教!

0 0
原创粉丝点击