LeetCode 64. 最小路径和

原题链接
解题思路:直观看上去就是一个dfs遍历所有的可能值,然后进行比较返回值(这种方式会超时),由于会把所有的可能性都罗列出来,所以结果集十分巨大,且会超时,以下还是把这种方式写出来,以供参考

    int res64=Integer.MAX_VALUE;
	public int minPathSumDfs(int[][] grid) {
		dfs64(0,0,grid,grid[0][0]);
		return res64;
	}
	public void dfs64(int nowL,int nowR,int[][] grid,int score){
		if (nowL<0 || nowR<0 || nowL>=grid.length || nowR >=grid[0].length)
			return;
		if (nowL==grid.length-1 && nowR == grid[0].length-1){
			res64=Math.min(res64,score);
			return;
		}
		dfs64(nowL+1,nowR,grid,score+grid[nowL][nowR]);
		dfs64(nowL,nowR+1,grid,score+grid[nowL][nowR]);
	}

dp思路:由于只能够左右移动,所以如grid[1][1]只能够从grid[0][1]或grid[1][0]中移动过来,也就是说dp[1][1]=dp[1][1]+Math.min(dp[1][0],dp[0][1]),这就是题目这题所需要的状态转移方程了,其中需要注意的是如grid[2][0]它只能够从grid[1][0]中过来,也就是说我们需要考虑一下边界的情况。最后答案就是grid中的右下角的值。

    public int minPathSum(int[][] grid) {
        for (int i = 0; i < grid.length; i++) {
			for (int j = 0; j < grid[i].length; j++) {
				if (i==j && i==0)
					grid[i][j]=grid[i][j];
				else
					grid[i][j]=grid[i][j] + Math.min((i-1)<0?Integer.MAX_VALUE:grid[i-1][j],(j-1)<0?Integer.MAX_VALUE:grid[i][j-1]);
			}
		}
		return grid[grid.length-1][grid[0].length-1];
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值