20200225:最小路径和(leetcode64)
最小路径和
- 题目
- 思路与算法
- 代码实现
- 时间复杂度分析
题目
思路与算法
- 这题和之前做过的不同路径Ⅰ,不同路径Ⅱ基本一致,状态方程式也基本一致,没有什么太多的思路,第一种方法就直接暴力枚举所有的节点到末尾的距离就行了。状态方程:dp[i][j] =grid[i][j] + min{dp[i+1][j],dp[i][j+1]}
- 第二种方法是直接计算一下每次的权值,存入对应的相同大小的数组中即可,可以从左上角开始,也可以从右下角开始算,结果不变。实际上可以不用新建数组,空间复杂度可以优化降低,但时间复杂度不变,因此不予列举,
代码实现
方法一
package com.immunize.leetcode.minPathSum;/*** 方法一: 根据动态状态方程直接写:dp[i][j] =grid[i][j] + min{dp[i+1][j],dp[i][j+1]}* * TLE* * @author Mr IMMUNIZE**/
public class Solution {// 根据动态方程,当前节点的到达路径等于其右边的点和其下边的点的路径之和// 写出从(i,j)到达右下角的路径值的计算private int calculate(int i, int j, int[][] grid) {// 特殊情况处理:边界点和终点的计算// 超出边界的处理if (i == grid.length || j == grid[0].length) {return Integer.MAX_VALUE;}// 终点的计算if (i == grid.length - 1 && j == grid[0].length - 1) {return grid[i][j];}// 状态方程return Math.min(calculate(i + 1, j, grid), calculate(i, j + 1, grid)) + grid[i][j];}public int minPathSum(int[][] grid) {return calculate(0, 0, grid);}
}
方法二
package com.immunize.leetcode.minPathSum;/*** 对方法一进行了优化,不枚举,直接计算出权重填入数组即可。* * @author Mr IMMUNIZE**/
public class Solution2 {public int minPathSum(int[][] grid) {// 初始化变量,新建权重二维数组int len1 = grid.length;int len2 = grid[0].length;int[][] weight = new int[len1][len2];// 对数组进行整体的遍历,倒序遍历,每次将权重值存入对应的位置for (int i = len1 - 1; i >= 0; i--) {for (int j = len2 - 1; j >= 0; j--) {// 如果是右下角的位置,则权重为其值if (i == len1 - 1 && j == len2 - 1) {weight[i][j] = grid[i][j];}// 最后一行的位置,权重为weight[i][j+1] + grid[i][j]if (i == len1 - 1 && j != len2 - 1) {weight[i][j] = weight[i][j + 1] + grid[i][j];}// 最后一列的位置,权重为weight[i+1][j] + grid[i][j]if (i != len1 - 1 && j == len2 - 1) {weight[i][j] = weight[i + 1][j] + grid[i][j];}// 其余位置的值,权重为Math.min(weight[i+1][j],weight[i][j+1])+grid[i][j]if (i != len1 - 1 && j != len2 - 1) {weight[i][j] = Math.min(weight[i + 1][j], weight[i][j + 1]) + grid[i][j];}}}// 遍历结束后直接返回weight[0][0]即可return weight[0][0];}
}
时间复杂度分析
方法一:(枚举法)每次有2条路可以选择,除了最后一行一列,但不影响复杂度O(2^(m+n))
方法二:需要遍历一遍数组,O(m*n)
20200225:最小路径和(leetcode64)相关推荐
- 最小路径和—leetcode64
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5, ...
- 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)
1. 数组去重 题目描述 /*** 有序数组去重* 输出最终的数字个数* 输入:1,2,2* 输出:2* @author Turing**/ 代码 import java.util.*; public ...
- LeetCode--64. 最小路径和(动态规划)
最小路径和(动态规划) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:中等 2. 题目分析 这道题目是62题.不同路径的延伸,解题思路基本一样的,是通过动态规划来实现的: - ...
- LeetCode-64.最小路径和
题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 思路 设dp为大小为 m x n的 ...
- 【网络流24题】最小路径覆盖问题
[题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...
- 最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)
在讲述这两个算法之前,首先有几个概念需要明白: 二分图: 二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边( ...
- 有向图最小路径覆盖方法浅析、证明 //hdu 3861
路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联. 对于一个有向无环图怎么求最小路径覆盖? 先构造二分图: 对于原图,先拆点,吧每个点i拆成ii,iii. ...
- HDU4160(最小路径覆盖问题)
题意:当满足条件wi<wj,hi<hl和li<lj时,求解通过优化嵌套给定的娃娃可以获得的最外层洋娃娃的最小数量. 思路:如果嵌套的娃娃越多,则剩下的娃娃就越少,意味着单独出来的娃娃 ...
- poj1422(最小路径覆盖问题)
最小路径覆盖数: 对于一个DAG(有向无环图),选取最少条路径,使得每个 顶点属于且仅属于一条路径.路径长度可以为零:(有向图中找一些路径,使之覆盖了图中的所有顶点,就是任意一个顶点都跟那些路径中的某 ...
最新文章
- python获取硬件信息
- 【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )
- AB1601某些io口不支持较高频率信号的输入
- Maven(四):定制库到Mave本地资源库 (Kaptcha)
- [译]试用新的System.Text.Json API
- unsigned char s1 : 2的用法
- 英雄联盟与人生奋斗的类比讨论
- Oracle PGA参数
- 你能打动客户的C++理由,一定要先说服自己相信
- 过去一年顶级借贷服务商BTC总托管资产平均增长超700%
- win10u盘被写保护怎么解除_Win10系统下U盘写保护应该如何破除!
- 武汉理工大学计算机学院转专业细则,计算机学院武汉理工大学2009年各学院转专业工作实施细则.doc...
- ALVA Systems发布AR新品 倪光南院士致辞
- configure error:Package requirements (openssl) were not met
- Docker的中央仓库
- Python3实现向指定邮箱发送邮件(支持附件文件、图片等)
- Ubuntu 如何直接回到桌面
- 2023电工杯数学建模B题思路
- 【NS2】cygwin+NS2.29安装之道 (转载)
- 怎么用Python批量添加zabbix-host主机