【剑指offer】矩阵的最小路径和 [Go语言]

186 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

描述

给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。

数据范围: 1≤n,m≤500,矩阵中任意值都满足 0≤ai,j​≤100

要求:时间复杂度 O(nm)

例如:当输入[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]时,对应的返回值为12,

所选择的最小累加和路径如下图所示:

image.png

输入描述:

第一行输入两个正整数 n 和 m 表示矩阵 a 的长宽

后续输入 n 行每行有 m 个数表示矩阵的每个元素

输出描述:

输出从左上角到右下角的最小路径和

示例1

输入:

4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0

输出:

12

示例2

输入:

2 3
1 2 3
1 2 3

输出:

7

AC Code

package main

import "fmt"

func main(){
    var n, m int
    fmt.Scan(&n,&m)
    nums := make([][]int,n)
    for i:=0;i<n;i++{
        nums[i] = make([]int,m)
        for j:=0;j<m;j++{
(1)            fmt.Scan(&nums[i][j])
        }
    }
    for i:=1;i<m;i++ {
(2)        nums[0][i]+=nums[0][i-1]
    }
    for i:=1;i<n;i++ {
(3)        nums[i][0]+=nums[i-1][0]
    }
    for i:=1;i<n;i++{
        for j :=1 ;j<m;j++{
(4)            nums[i][j] += min(nums[i][j-1],nums[i-1][j])
        }
    }
(5)    fmt.Print(nums[n-1][m-1])
}


(6) func min(a,b int) int {
    if a<b {
        return a
    }
    return b
}
  • (1) 输入元素
  • (2) 先将确定左边界
  • (3) 再确定上边界,保证不超界限
  • (4) 然后进行遍历,不断进行迭加对比即可,加上左边和上面哪个比较小,选择小的
  • (5) 返回最中的答案
  • (6) 小的返回即可