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,
所选择的最小累加和路径如下图所示:
输入描述:
第一行输入两个正整数 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) 小的返回即可