矩阵的最小路径和

题目描述

给定一个矩阵M,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。(难度:简单,降低空间复杂度)

题解

dp[i][j]表示到达该位置的最小路径和。

  • 当i=0,j>0时dp[i][j]=dp[i][j-1]+m[i][j]
  • 当j=0,i大于0时dp[i][j]=dp[i-1][j]+m[i][j]
  • 当i>0,j>0时dp[i][j]=min(dp[i-1][j],dp[i][j-1])+m[i][j]
  • 右下角的值即为最终的结果
  • 此时空间复杂度为O(MN),可以降为O(min(M,N))

假设矩阵M由m行,n列构成,如果m≥n,那么生成一个长度为n的数组arr,

  • 初始数组中存储第一行的路径和,
  • 当遍历第二行元素时,arr[0]=arr[0]+M[1][0],arr[1]=min(arr[0],arr[1])+M[1][1],
  • 依次重复此操作,因为下一行的值仅仅依赖于上一行和前一列,与其他位置无关。
  • 如果m小于n,那么初始就存储第一列的路径和,依次向右计算。
public int matrixPath(int[][]ma) {
		if(ma==null||ma.length==0||ma[0].length==0)
			return 0;
		int small=Math.min(ma.length,ma[0].length);
		int big=Math.max(ma.length,ma[0].length);
		int[] midSum=new int[small];
		midSum[0]=ma[0][0];
		boolean row=big==ma.length;//行大于列
		for(int i=1;i<small;i++) {
			midSum[i]=midSum[i-1]+(row?ma[0][i]:ma[i][0]);
		}
		for(int i=1;i<big;i++) {
			midSum[0]=midSum[0]+(row?ma[i][0]:ma[0][i]);
			for(int j=1;j<small;j++) {
				midSum[j]=Math.min(midSum[j-1], midSum[j])+
						(row?ma[i][j]:ma[j][i]);
			}
		}
		return midSum[small-1];
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值