再战leetcode (120.三角形最小路径和)

该博客探讨了一种动态规划算法,用于求解给定三角形中从顶部到底部的最小路径和。作者提供了Java和Go两种语言的实现,通过逐层更新每个节点的最小路径和,最终找到全局最小值。这种方法有效地减少了重复计算,提高了效率。
摘要由CSDN通过智能技术生成

120.三角形最小路径和

题目描述

在这里插入图片描述

题解

从上往下取,我们可以看出来第一个数字和最后一个数字其实都是固定的.

java

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int ans = Integer.MAX_VALUE;
        int n = triangle.size();
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < triangle.get(i).size(); j++) {
                if (j == 0) {
                    triangle.get(i).set(j, triangle.get(i).get(j) + triangle.get(i - 1).get(j));
                } else if (j == i) {
                    triangle.get(i).set(j, triangle.get(i).get(j) + triangle.get(i - 1).get(j - 1));
                }else{
                    triangle.get(i).set(j,triangle.get(i).get(j)+Math.min(triangle.get(i-1).get(j),triangle.get(i-1).get(j-1)));
                }
            }
        }
        for (Integer integer : triangle.get(n - 1)) {
            if (integer<ans){
                ans = integer;
            }
        }
        return ans;
    }
}

go

func minimumTotal(triangle [][]int) int {
	n := len(triangle)
	// 初始化一个二维数组 n*n其中元素都为0
	// [[],[],[]...n]
	f := make([][]int, n)
	const WIDTH int = 10
	for i := 0; i < n; i++ {
		// [0,0,0...n]
		f[i] = make([]int, n)
	}
	f[0][0] = triangle[0][0]
	for i := 1; i < n; i++ {
		// 第一个元素不需要跟其他元素比大小
		f[i][0] = f[i-1][0] + triangle[i][0]
		for j := 1; j < i; j++ {
			f[i][j] = min(f[i-1][j-1], f[i-1][j]) + triangle[i][j]
		}
		f[i][i] = f[i-1][i-1] + triangle[i][i]
	}
	ans := math.MaxInt32
	for i := 0; i < n; i++ {
		ans = min(ans, f[n-1][i])
	}
	return ans
}

func min(num1 int, num2 int) int {
	if num1 > num2 {
		return num2
	}
	return num1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值