Leetcode--120. 三角形最小路径和
給定一個(gè)三角形,找出自頂向下的最小路徑和。每一步只能移動(dòng)到下一行中相鄰的結(jié)點(diǎn)上。
例如,給定三角形:
[
? ? ?[2],
? ? [3,4],
? ?[6,5,7],
? [4,1,8,3]
]
自頂向下的最小路徑和為?11(即,2?+?3?+?5?+?1?= 11)。
說明:
如果你可以只使用 O(n)?的額外空間(n 為三角形的總行數(shù))來解決這個(gè)問題,那么你的算法會(huì)很加分。
?
空間復(fù)雜度O(n^2)
自底向上遍歷,每個(gè)dp存的是當(dāng)前位置的最小值
例如:dp[2][1]處就是他自己的值加上下一行中與他相鄰的兩個(gè)值中的最小值
動(dòng)態(tài)方程:dp[i][j] = triangle.get(i).get(j)+java.lang.Math.min(dp[i+1][j], dp[i+1][j+1]);
提交的代碼:
class Solution {
? ? public int minimumTotal(List<List<Integer>> triangle) {
? ? ? ? int n = triangle.size();
?? ??? ?int[][] dp = new int[n][triangle.get(n-1).size()];
?? ??? ?int i,j;
?? ??? ?for(i=0;i<triangle.get(n-1).size();i++)
?? ??? ?{
?? ??? ??? ?dp[n-1][i] = triangle.get(n-1).get(i);
?? ??? ?}
?? ??? ?for(i=n-2;i>=0;i--)
?? ??? ?{
?? ??? ??? ?for(j=0;j<triangle.get(i).size();j++)
?? ??? ??? ?{
?? ??? ??? ??? ?dp[i][j] = triangle.get(i).get(j)+java.lang.Math.min(dp[i+1][j], dp[i+1][j+1]);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return dp[0][0];
? ? }
}
完整的代碼:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main
{
?? ?public static int minimumTotal(List<List<Integer>> triangle) {
?? ??? ?int n = triangle.size();
?? ??? ?int[][] dp = new int[n][triangle.get(n-1).size()];
?? ??? ?int i,j;
?? ??? ?for(i=0;i<triangle.get(n-1).size();i++)
?? ??? ?{
?? ??? ??? ?dp[n-1][i] = triangle.get(n-1).get(i);
?? ??? ?}
?? ??? ?for(i=n-2;i>=0;i--)
?? ??? ?{
?? ??? ??? ?for(j=0;j<triangle.get(i).size();j++)
?? ??? ??? ?{
?? ??? ??? ??? ?dp[i][j] = triangle.get(i).get(j)+java.lang.Math.min(dp[i+1][j], dp[i+1][j+1]);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return dp[0][0];
?? ?}
?? ?public static void main(String[] args)
?? ?{
?? ??? ??? ?//[
?? ??? ??? ?//[2],
?? ??? ??? ?//[3, 4],
?? ??? ??? ?//[6, 5, 7],
?? ??? ??? ?//[4, 1, 8, 3]
?? ??? ??? ?//]
?? ??? ??? ? ? ? ? ?List<List<Integer>> list = new ArrayList<>();
?? ??? ??? ? ? ? ? ?List<Integer> subList0 = new ArrayList<>();
?? ??? ??? ? ? ? ? ?subList0.add(2);
?? ??? ??? ? ? ? ? ?List<Integer> subList1 = new ArrayList<>();
?? ??? ??? ? ? ? ? ?subList1.add(3);
?? ??? ??? ? ? ? ? ?subList1.add(4);
?? ??? ??? ? ? ? ? ?List<Integer> subList2 = new ArrayList<>();
?? ??? ??? ? ? ? ? ?subList2.add(6);
?? ??? ??? ? ? ? ? ?subList2.add(5);
?? ??? ??? ? ? ? ? ?subList2.add(7);
?? ??? ??? ? ? ? ? ?List<Integer> subList3 = new ArrayList<>();
?? ??? ??? ? ? ? ? ?subList3.add(4);
?? ??? ??? ? ? ? ? ?subList3.add(1);
?? ??? ??? ? ? ? ? ?subList3.add(8);
?? ??? ??? ? ? ? ? ?subList3.add(3);
?? ??? ??? ??
?? ??? ??? ? ? ? ? ?list.add(subList0);
?? ??? ??? ? ? ? ? ?list.add(subList1);
?? ??? ??? ? ? ? ? ?list.add(subList2);
?? ??? ??? ? ? ? ? ?list.add(subList3);
?? ??? ??? ??
?? ??? ??? ? ? ? ? ?System.out.println(minimumTotal(list));
?? ?}
}
?
總結(jié)
以上是生活随笔為你收集整理的Leetcode--120. 三角形最小路径和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剑指offer】面试题66:构建乘积数
- 下一篇: Leetcode--210.课程表Ⅱ