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

    题目如下:

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
    
    Note: You can only move either down or right at any point in time.

    思路:

    因为只能往右或往下走,所以可以初始化当res[m][0], res[0][n]这些边界情况

    然后,每一步结果为当前值+min(上边一步,左边一步),即res[i][j] = grid[i][j] + min(res[i-1][j], res[i][j-1])

    本体代码:

    /**
     * Created by yuanxu on 17/4/13.
     */
    public class DP64 {
    
        public static int minPathSum(int[][] grid) {
            int m = grid.length;
            int n = grid[0].length;
            int res[][] = new int[m][n];
    
            // boundary conditions
            res[0][0] = grid[0][0];
            for (int i=1; i<m; i++) {
                res[i][0] = grid[i][0] + res[i-1][0];
            }
            for (int j=1; j<n; j++) {
                res[0][j] = grid[0][j] + res[0][j-1];
            }
    
            // dp
            for (int i=1; i<m; i++) {
                for (int j=1; j<n; j++) {
                    res[i][j] = grid[i][j] + (res[i-1][j] < res[i][j-1] ? res[i-1][j] : res[i][j-1]);
                }
            }
    
            return res[m-1][n-1];
        }
    
        public  static void main(String[] args) {
            int grid[][] = {{1,2},{1,1}};
            System.out.println(minPathSum(grid));
        }
    }

    网上的解答有空间复杂度为0的:

    public class Solution {
        public int minPathSum(int[][] grid) {
            int m = grid.length;// row
            int n = grid[0].length; // column
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (i == 0 && j != 0) {
                        grid[i][j] = grid[i][j] + grid[i][j - 1];
                    } else if (i != 0 && j == 0) {
                        grid[i][j] = grid[i][j] + grid[i - 1][j];
                    } else if (i == 0 && j == 0) {
                        grid[i][j] = grid[i][j];
                    } else {
                        grid[i][j] = Math.min(grid[i][j - 1], grid[i - 1][j])
                                + grid[i][j];
                    }
                }
            }
    
            return grid[m - 1][n - 1];
        }
    }

    ref: https://discuss.leetcode.com/topic/5459/my-java-solution-using-dp-and-no-extra-space

  • 相关阅读:
    自定义能够for each的类,C#,Java,C++,C++/cli的实现方法
    答网友强护灰飞烟灭关于接口的问题
    浅谈C++的this指针
    padding与margin的区别(网上转的)
    啦啦啦 刚注册的,先水一篇~
    直接把页面的table导出到excel表中
    从FTP下载文件带进度条
    C# 从FTP上下载指定文件到本机
    “无法在证书存储区中找到清单签名证书”错误的解决方法
    网页设置不可复制
  • 原文地址:https://www.cnblogs.com/pinganzi/p/6703286.html
Copyright © 2011-2022 走看看