分享一道微软一面算法题"三角形最小路径和"

340 阅读2分钟

我正在参加「掘金·启航计划」

微软作为一家顶级的"大厂", 挑选候选者时, 对算法的考核相对严格

下面跟小伙伴萌分享一道力扣中等难度的常考算法供小伙伴萌一起卷.

给定一个三角形 triangle, 找出自顶向下的最小路径和.

  • 每一步只能移动到下一行中相邻的结点上. 相邻的结点 在这里指的是 下标上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点.
输入: triangle = [[2], [3,4], [6,5,7], [4,1,8,3]]
输出: 11
解释: 如下面简图所示

image.png

  • 自顶向下的最小路径和为11(即, 2 + 3 + 5 + 1 = 11).
  • 解法采用:
  1. 从上往下的动态规划
  2. 从下往上的动态规划
  3. 从下往上的动态规划(使用一维数组)
  • 思路 image.png
  • 存储的是到达第i+1层各个结点的最小路径之和

image.png

image.png

image.png

image.png

image.png

image.png

class Solution {
    public int miniumTotal(List<List<Integer>> triangle) 
        // triangle 是个二维数组
        // 先获取 triangle 的层数, 即一维数组的个数
        int n = triangle.size();
        
        // 设置一个一维数组, 动态的更新每一层中当前结点对应的最短路径
        int[] dp = new int[n + 1];
        
        // 从最后一层开始计算结点的最短路径, 直到顶层 0层 为止
        for (int i = n - 1; i >= 0; i--) {
            // dp 中存储的是前 i 个位置存储的是到达第 i 层各个结点的最小路径和
            // 从每一层的第 0 个位置开始
            for (int j = 0; j <=i ; j++) {
                // dp[j] 表示第 i 层中第 j 个结点的最小路径和
                dp[j] = triangle.get(i).get(j) + Math.min(dp[j], dp[j+1]);
            }
        }
        
        // 返回结果
        return dp[0];
    }
}

发文不易, 喜欢点赞的人更有好运气👍 :), 定期更新+关注不迷路~

ps:欢迎加入笔者18年建立的研究iOS审核及前沿技术的三千人扣群:662339934,坑位有限,备注“掘金网友”可被群管通过~