矩阵的最小路径和

     

//矩阵的最小路径和
public class minMatrixLength{
	//(1)动态规划法(非压缩矩阵 时间复杂度O(M*N),空间复杂度O(M*N))
	public static int getminMatrixLength(int[][]matrix)
	{
		if(matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0)
		{
			return 0;
		}
		int row=matrix.length; //矩阵的行数
		int col=matrix[0].length; //矩阵的列数
		int [][]dp=new int[row][col]; //存储到各个节点的最短路径
		dp[0][0]=matrix[0][0];
		for(int i=1;i<row;i++)
		{
			dp[i][0]=dp[i-1][0]+matrix[i][0]; //第一列
		}
		for(int j=1;j<col;j++)
		{
			dp[0][j]=dp[0][j-1]+matrix[0][j];//第一行
		}
		//动态规划法求到各个节点的最短路径矩阵
		for(int i=1;i<row;i++)
		{
			for(int j=1;j<col;j++)
			{
				dp[i][j]=Math.min(dp[i][j-1],dp[i-1][j])+matrix[i][j];
			}
		}
		return dp[row-1][col-1]; //返回矩阵右下角的最后一个数

	}
	//(2)动态规划法(滚动法)(压缩矩阵 时间复杂度O(M*N),空间复杂度min(M,N))
	public static int getminMatrixLength2(int[][]matrix)
	{
      if(matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0)
	  {
			return 0;
	  }
	  int more=Math.max(matrix.length,matrix[0].length);//行数与列数较大的那个为more
	  int less=Math.min(matrix.length,matrix[0].length);//行数与列数较小的那个为less
	  boolean rowmore=more==matrix.length; //行数是不是大于等于列数
	  int[]arr=new int[less]; //辅助数组的长度为行数和列数中的最小值
	  arr[0]=matrix[0][0];   //第一个数赋予初始值
	  for(int i=1;i<less;i++)
	  {
	  	arr[i]=arr[i-1]+(rowmore?matrix[0][i]:matrix[i][0]);//第一行或者第一列的值
	  }
      for(int i=1;i<more;i++)
      {
      	arr[0]=arr[0]+(rowmore?matrix[i][0]:matrix[0][i]);//向下或者向右滚动
      	 for(int j=1;j<less;j++)
      	 {
      	 	arr[j]=Math.min(arr[j-1],arr[j])+(rowmore?matrix[i][j]:matrix[j][i]);//向下或者向右滚动
      	 }
      }

       return arr[less-1];
	}

	public static void main(String[]args)
	{
		int [][]matrix={{1,3,5,9},
		                {8,1,3,4},
		                {5,0,6,1},
		                {8,8,4,0}
		              };
        //方法一
		System.out.println(getminMatrixLength(matrix));
		//方法二
		System.out.println(getminMatrixLength2(matrix));

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值