zoukankan      html  css  js  c++  java
  • 64. Minimum Path Sum

    最后更新

    二刷?

    和小机器人走路径差不多= =
    这个可以在原有的盘子上更新= = 如果不是只读。

    Time : O(N) + O(M) + O(M * N)
    Space: in-place

    public class Solution {
        public int minPathSum(int[][] grid) {
            if (grid.length == 0) return 0;
            
            for (int i = 1; i < grid.length; i++) {
                grid[i][0] += grid[i-1][0];
            }
            for (int i = 1; i < grid[0].length; i++) {
                grid[0][i] += grid[0][i-1];
            }
            
            for (int i = 1; i < grid.length; i++) {
                for (int j = 1; j < grid[0].length; j++) {
                    grid[i][j] += Math.min(grid[i-1][j], grid[i][j-1]);
                }
            }
            
            return grid[grid.length-1][grid[0].length-1];
        }
    }
    

    如果是in-place,依然是一维数组。

    2D board使用一维数组要确定2个东西,一个是每一行的初始状态,小机器人里初始状态是0,来自左边是不可能的,只有来自上面一种可能,所以是1.

    这里初始无限大。。表示只能选来自上面方向。
    第一行的第一个初始状态得是0+格子里的数,后面每行初始设置为无限大就行。

    public class Solution {
        public int minPathSum(int[][] grid) {
            if (grid.length == 0) return 0;
            
            int row = grid.length;
            int col = grid[0].length;
            
            int[] dp = new int[col+1];
        
            Arrays.fill(dp, Integer.MAX_VALUE);
            
            dp[0] = 0;
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    dp[j+1] = Math.min(dp[j+1], dp[j]) + grid[i][j];
                }
                dp[0] = Integer.MAX_VALUE;
            }
            
            
            return dp[col];
        }
    }
    
    

    这种题的最后挑战就是滚动数组。。


    一刷。

    动态规划,和那个机器人走路的差不多,只不过这次是每个格子有2种可能,左边或者上边,选较小的那个。

    public class Solution {
        public int minPathSum(int[][] grid) 
        {
            if(grid.length == 0) return 0;
            int[][] dp = new int[grid.length][grid[0].length];
            dp[0][0] = grid[0][0];
            for(int i = 1; i<grid.length;i++) dp[i][0] = dp[i-1][0] + grid[i][0];
            for(int i = 1; i < grid[0].length; i++) dp[0][i] = dp[0][i-1] + grid[0][i];
            
            for(int i = 1; i < grid.length; i++)
                for(int j = 1; j < grid[0].length; j++)
                {
                    dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]);
                    dp[i][j]+=grid[i][j];
                }
            return dp[grid.length-1][grid[0].length-1];    
        }
    }
    

    感觉上是可以不用M*N的extra space。
    直接更新在原来的grid上也不是不可以。。

  • 相关阅读:
    Windows系统开机硬盘自检问题解决
    更改软件默认安装路径
    windows添加开机启动项
    xp 如何打开(进行)远程桌面连接
    xp看系统位数
    教你创建一个别人打不开删不掉的文件夹(干坏事爱好者必看)
    无操作一段时间显示器无信号
    长时间用电脑,(给窗口选一个合适的颜色)设置窗口绿色
    Windows右键菜单设置与应用技巧
    Outlook如何定时发邮件
  • 原文地址:https://www.cnblogs.com/reboot329/p/6206204.html
Copyright © 2011-2022 走看看