Leetcode120. 三角形最小路径和

题目传送https://leetcode.cn/problems/triangle/

运行效率
第一种写法效率
在这里插入图片描述

第二种写法效率
在这里插入图片描述

代码如下:
①第一种写法: map+动态规划法

class Solution {
    //map当缓存使用,提升查询效率
   Map<String, Integer> map = new HashMap<String, Integer>();
  public int minimumTotal(List<List<Integer>> triangle) {
    int total = Integer.MAX_VALUE;
    // 三角形的最后一行
    List<Integer> lastRow = triangle.get(triangle.size() - 1);
    for (int i = 0; i < lastRow.size(); i++) {
      int path = helper(triangle, triangle.size() - 1, i);
      total = Math.min(path, total);
    }
    return total;
  }

  /*
   * @description:  从三角形的某一行的第一个元素开始,计算从三角形的顶点到该元素的最短路径是多少。
   *  然后再计算第二个元素,第三个元素,直到把该行的所有元素都计算一遍,取最小路径
   * @date: 2022/8/29 19:21
   * @param row  当前行索引
   * @param i  当前行的 i索引位置
   * @return: 最短路径
   */
  public int helper(List<List<Integer>> triangle, int row, int i) {
    // 处理边界情况
    if (row == 0) {
      return triangle.get(0).get(0);
    }
    // 上一行
    List<Integer> preRow = triangle.get(row - 1);
    // 当前行
    List<Integer> curRow = triangle.get(row);
    // 当前行第i个位置的元素值
    Integer curVal = curRow.get(i);
    if (row == 1) {
      return preRow.get(0) + curVal;
    }
    // 递归计算上一行的第i-1个元素和第i个元素的最短路径
    int path1 = Integer.MAX_VALUE;
    int path2 = Integer.MAX_VALUE;
    if (i - 1 >= 0) {
      String key = (row - 1) + ":" + (i - 1);
      if (map.containsKey(key)) {
        path1 = map.get(key);
      } else {
        path1 = helper(triangle, row - 1, i - 1);
        map.put(key, path1);
      }
    }
    if (i < preRow.size()) {
      String key = (row - 1) + ":" + i;
      if (map.containsKey(key)) {
        path2 = map.get(key);
      } else {
        path2 = helper(triangle, row - 1, i);
        map.put(key, path2);
      }
    }
    return Math.min(path1, path2) + curVal;
  }
}

②第二种写法 动态规划法

class Solution {
 public int minimumTotal(List<List<Integer>> triangle) {
    int total = Integer.MAX_VALUE;
    //三角形最后一行的元素个数
    int size = triangle.get(triangle.size() - 1).size();
    //处理边界情况
    if(triangle.size()==1){
      return triangle.get(0).get(0);
    }
    int[][] dp = new int[size][size];
    // 初始化dp[0][0]
    dp[0][0] = triangle.get(0).get(0);
    for (int row = 1; row < triangle.size(); row++) {
      for (int i = 0; i < triangle.get(row).size(); i++) {
        // 当前行
        List<Integer> curRow = triangle.get(row);
        // 当前行第i个位置的元素值
        Integer curVal = curRow.get(i);
        int path1 = Integer.MAX_VALUE;
        int path2 = Integer.MAX_VALUE;
        if (i <= triangle.get(row - 1).size() - 1) {
          path1 = dp[row - 1][i];
        }
        if (i - 1 >= 0) {
          path2 = dp[row - 1][i - 1];
        }
        dp[row][i] = Math.min(path1, path2) + curVal;
        if (row == triangle.size() - 1) {
          total = Math.min(total, dp[row][i]);
        }
      }
    }
    return total;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java全栈研发大联盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值