返回轨道
算法 · 2026-05-14 · 27 阅读

P208 三角形中的最小路径和

算法 27 阅读

信号摘要

难度:Medium · 时长:14:32 · leetcode 120 · lintcode 109

P208 三角形中的最小路径和

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个数字三角形,你要找到从上到下路径和最小的一条路径,然后返回这个最小的路径和。

注意,每一次你只能移动到下一行相邻的两个数字上。

比如说,给你的数字三角形 a 是:

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

在这个三角形中,路径和最小的路径是 [1,3,1,1]。它的和等于 6。因此,你要返回的最小路径和就是 6。

相关视频:最小路径和

代码

public class AlgoCasts {

  // Time: O(n^2), Space: O(n^2)
  public int minimumTotalTopDown(List<List<Integer>> a) {
    int n = a.size();
    int[][] d = new int[n][n];
    d[0][0] = a.get(0).get(0);

    for (int i = 1; i < n; ++i) {
      d[i][0] = d[i-1][0] + a.get(i).get(0);
      d[i][i] = d[i-1][i-1] + a.get(i).get(i);
      for (int j = 1; j < i; ++j) {
        d[i][j] = Math.min(d[i-1][j-1], d[i-1][j]) + a.get(i).get(j);
      }
    }
    int min = d[n-1][0];
    for (int i = 1; i < n; ++i)
      min = Math.min(min, d[n-1][i]);
    return min;
  }

  // Time: O(n^2), Space: O(n)
  public int minimumTotalTopDownOn(List<List<Integer>> a) {
    int n = a.size();
    int[] d = new int[n];
    d[0] = a.get(0).get(0);

    for (int i = 1; i < n; ++i) {
      int pre = d[0];
      d[i] = d[i-1] + a.get(i).get(i);
      d[0] = d[0] + a.get(i).get(0);
      for (int j = 1; j < i; ++j) {
        int tmp = d[j];
        d[j] = Math.min(pre, d[j]) + a.get(i).get(j);
        pre = tmp;
      }
    }
    int min = d[0];
    for (int i = 1; i < n; ++i)
      min = Math.min(min, d[i]);
    return min;
  }

  // Time: O(n^2), Space: O(n^2)
  public int minimumTotalBottomUp(List<List<Integer>> a) {
    int n = a.size();
    int[][] d = new int[n][n];
    for (int j = 0; j < n; ++j)
      d[n-1][j] = a.get(n-1).get(j);
    for (int i = n-2; i >= 0; --i)
      for (int j = 0; j <= i; ++j)
        d[i][j] = Math.min(d[i+1][j], d[i+1][j+1]) + a.get(i).get(j);
    return d[0][0];
  }

  // Time: O(n^2), Space: O(n)
  public int minimumTotalBottomUpOn(List<List<Integer>> a) {
    int n = a.size();
    int[] d = new int[n];
    for (int j = 0; j < n; ++j)
      d[j] = a.get(n-1).get(j);
    for (int i = n-2; i >= 0; --i)
      for (int j = 0; j <= i; ++j)
        d[j] = Math.min(d[j], d[j+1]) + a.get(i).get(j);
    return d[0];
  }

}

📡 通讯频道