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).
Solution:
public class Solution { public int minimumTotal(List<List<Integer>> triangle) { if (triangle.size()==0) return 0; if (triangle.size()==1){ List<Integer> temp = triangle.get(0); return temp.get(0); } List<Integer> pre = new ArrayList<Integer>(); List<Integer> cur = new ArrayList<Integer>(); cur.add(triangle.get(0).get(0)); for (int i=1;i<triangle.size();i++){ pre = cur; cur = new ArrayList<Integer>(); List<Integer> curTri = triangle.get(i); //j==0 cur.add(curTri.get(0)+pre.get(0)); //j==1 to (size()-2) for (int j=1;j<curTri.size()-1;j++) if (pre.get(j-1)<pre.get(j)) cur.add(curTri.get(j)+pre.get(j-1)); else cur.add(curTri.get(j)+pre.get(j)); //j==size()-1 int last = curTri.size()-1; cur.add(curTri.get(last)+pre.get(last-1)); } int min = Integer.MAX_VALUE; for (int i=0;i<cur.size();i++) if (cur.get(i)<min) min = cur.get(i); return min; } }
This is a DP problem. At each point, the min path = min(min path to its left adjacent in higher level, min path to its right adjacent in higher level)+its value.
Just be careful when addressing boundary points.