【动态规划】64. 最小路径和

2023-05-16

题目

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:[ [1,3,1], [1,5,1], [4,2,1] ]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-path-sum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


动态规划

很经典的动态规划题,动态规划是一种优化方法,一般用于求最值,它适用于后一阶段最优取决于上一阶段最优的问题,这类问题一定具备最优子结构,通过子问题的最优值得到原问题的最值,动态规划的过程实际上也是一个填表的过程

对于该题,需要求从左上角到右下角的最小路径,且只能向下或向右走,则大问题是从左上角走到右下角,大问题的上一阶段是两个子问题:

  • q 1 q_1 q1:从左上角走到右下角的左边一个位置
  • q 2 q_2 q2:从左上角走到右下角的上面一个位置

只要这两个子问题已知,则原问题的解就是 m i n ( q 1 , q 2 ) + g r i d [ m ] [ n ] min(q_1, q_2)+grid[m][n] min(q1,q2)+grid[m][n],同样的,子问题 q 1 q_1 q1 q 2 q_2 q2又对应了各自的两个子问题,因此可以从最小的子问题开始,即从左上角走到左上角,不断得到大问题的解,这个过程就是填表的过程,整个表填完则得到大问题的解

class Solution {
	public int m, n;

	public int minPathSum(int[][] grid) {
		m = grid.length;
		n = grid[0].length;
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if (i > 0 && j > 0) {
					grid[i][j] = Math.min(grid[i][j - 1], grid[i - 1][j]) + grid[i][j];
				} else {
					if (i == 0 && j == 0)
						continue;
					if (i == 0)
						// top row
						grid[i][j] += grid[i][j - 1];
					if (j == 0)
						// left col
						grid[i][j] += grid[i - 1][j];
				}
			}
		}
		return grid[m - 1][n - 1];
	}
}

递归(超时)

正如上面介绍,原问题的解就是 m i n ( q 1 , q 2 ) + g r i d [ m ] [ n ] min(q_1, q_2)+grid[m][n] min(q1,q2)+grid[m][n],因此也可以使用递归法,但是效率比较低,超时。。。

class Solution {
	public int nums[][], m, n, min;

	public int minPathSum(int[][] grid) {
		m = grid.length;
		n = grid[0].length;
		nums = new int[m][n];
		min = Integer.MAX_VALUE;
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				nums[i][j] = grid[i][j];
		return walk(0, 0);
	}

	public int walk(int i, int j) {
		if (i >= m || j >= n)
			return Integer.MAX_VALUE;
		if (i == m - 1 && j == n - 1)
			// arrive at right down
			return nums[i][j];
		// down or right
		return Math.min(walk(i, j + 1), walk(i + 1, j)) + nums[i][j]; 
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【动态规划】64. 最小路径和 的相关文章

  • 【string】字符串分割strock

    使用strock将字符串按特定分隔符分割 span class token macro property span class token directive keyword include span span class token st
  • 【string】字符串转int stoi

    使用stoi函数将字符串转为int型 xff0c 需要 include lt string gt span class token keyword char span chs span class token punctuation spa
  • Visual Studio解决const char *与LPCWSTR 不兼容

    项目 gt 属性 gt 配置属性 gt 高级 xff0c 将字符集改为未设置
  • 【C++】文件读写指针定位

    主要函数 xff1a 指针定位函数SetFilePointer xff0c 读文件ReadFile xff0c 写文件WriteFile 首先使用CreateFile创建文件 xff0c SetFilePointer函数将指针定位到文件指定
  • 【C++】程序计时

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • 【双指针】15.三数之和

    题目 给你一个包含 n 个整数的数组 nums xff0c 判断 nums 中是否存在三个元素 a xff0c b xff0c c xff0c 使得 a 43 b 43 c 61 0 xff1f 请你找出所有满足条件且不重复的三元组 注意
  • 函数定义中的冒号和箭头

    函数中变量后面加冒号和类型表示该参数的建议类型 xff0c 如下参数A的建议类型是int xff0c 参数B的建议类型是str xff0c gt 表示该函数的返回值类型 xff0c 例如fun函数的返回值类型是str span class
  • chrom控件命令行加载

    34 C Users lt name gt AppData Local Google Chrome Application chrome exe 34 load extension 61 34 lt path to unpacked ext
  • 【二叉树】创建、先序遍历、中序遍历、后序遍历、层序遍历 Java实现

    二叉树的创建 二叉树的创建可以采用递归方式 xff0c 传入一个数组 xff0c 例如数组 3 9 20 null null 15 7 表示的二叉为 span class token number 3 span span class tok
  • 【二叉树】平衡二叉树

    平衡二叉树是一种二叉查找树又称为AVL树 Adelsen Velskii and Landis xff0c 特点为每个节点的左 右子树深度之差的绝对值不大于1 xff0c 左子树的值小于右子树 xff0c 重要操作为插入和删除 插入 插入新
  • win10搭建hadoop2.7.7

    配置java环境 配置java环境 xff0c 官网下载jdk较慢 xff0c 百度网盘 xff1a 链接 xff1a https pan baidu com s 1wX7LxPMjcS9QGc4c4cPJgw 提取码 xff1a 9e38
  • win10配置spark

    下载spark压缩包 xff0c 链接 xff1a https pan baidu com s 1y5JlMdtkrZFyTJWKtuuZ Q 提取码 xff1a z64y 解压tar gz文件 配置环境变量 xff0c 系统变量Path中
  • 【HDFS】上传、查看、下载、删除文件命令

    上传 首先启动HDFS xff0c 任意目录下输入命令start dfs xff08 若没有配置sbin的环境变量则需要在sbin目录下打开cmd输入该命令 xff09 xff0c 出现以下两个框框 在需要上传文件的文件路径下打开cmd命令
  • IntelliJ IDEA开发spark应用(scala)

    配置spark环境 xff0c 可参考官网下载 IntelliJ IDEA xff0c 然后安装 xff0c 一直next即可 安装Scala插件 创建一个新工程 Ctrl 43 Shift 43 Alt 43 s xff0c 导入spar
  • 【STL】vector简单使用

    参考 需要头文件 span class token macro property span class token directive keyword include span span class token string lt iost
  • 【python效率优化】使用map优化for循环

    python提供的高级函数map将一个函数作用于可迭代对象的每一个元素 xff0c 底层自动实现并行 xff0c 运行速度比for循环要快 xff0c 对于无前后联系的for循环 xff0c 可以使用map进行优化 xff0c 以下例子对比
  • 【数组】121. 买卖股票的最佳时机

    题目 给定一个数组 xff0c 它的第 i 个元素是一支给定股票第 i 天的价格 如果你最多只允许完成一笔交易 xff08 即买入和卖出一支股票一次 xff09 xff0c 设计一个算法来计算你所能获取的最大利润 注意 xff1a 你不能在
  • 【双指针】26. 删除排序数组中的重复项

    题目 给定一个排序数组 xff0c 你需要在 原地 删除重复出现的元素 xff0c 使得每个元素只出现一次 xff0c 返回移除后数组的新长度 不要使用额外的数组空间 xff0c 你必须在 原地 修改输入数组 并在使用 O 1 额外空间的条
  • centos下安装chrome

    到网页 https www google cn chrome 点击安装 下载 rpm安装包 安装即可 root 64 localhost 下载 yum localinstall google chrome stable current x8
  • 【双指针】80. 删除排序数组中的重复项 II

    题目 给定一个排序数组 xff0c 你需要在原地删除重复出现的元素 xff0c 使得每个元素最多出现两次 xff0c 返回移除后数组的新长度 不要使用额外的数组空间 xff0c 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成

随机推荐

  • 【双指针】27. 移除元素

    题目 给你一个数组 nums 和一个值 val xff0c 你需要 原地 移除所有数值等于 val 的元素 xff0c 并返回移除后数组的新长度 不要使用额外的数组空间 xff0c 你必须仅使用 O 1 额外空间并 原地 修改输入数组 元素
  • 【栈】155. 最小栈

    题目 设计一个支持 push xff0c pop xff0c top 操作 xff0c 并能在常数时间内检索到最小元素的栈 push x 将元素 x 推入栈中 pop 删除栈顶的元素 top 获取栈顶元素 getMin 检索栈中的最小元素
  • 【数组】初始化、获取长度

    初始化 xff0c 获取长度 span class token keyword public span span class token keyword class span span class token class name main
  • 【Stack】简单使用

    入栈 xff1a add获取栈顶元素 xff1a peek出栈 xff1a pop span class token keyword import span java span class token punctuation span ut
  • 【HashMap】基本操作

    添加键值对put获取key对应的value get遍历 xff1a keySet span class token keyword import span java span class token punctuation span uti
  • 【单调栈】496. 下一个更大元素 I

    题目 给定两个 没有重复元素 的数组 nums1 和 nums2 xff0c 其中nums1 是 nums2 的子集 找到 nums1 中每个元素在 nums2 中的下一个比其大的值 nums1 中数字 x 的下一个更大元素是指 x 在 n
  • 【堆】建堆、插入、删除、堆排序

    参考 堆就是利用数组来实现二叉树 xff0c 可用于构建优先队列 堆排序 TopK问题等 可分为 xff1a 最大堆 xff1a 父节点的值比其子节点大最小堆 xff1a 父节点的值比其子节点小 堆的根节点存放了最小 xff08 或最大 x
  • 【RDD编程】cache持久化使用场景

    Spark中RDD采用惰性求值的机制 xff0c 每次遇到action操作都会触发一次从头开始执行的计算 xff0c 在某些场景下这会使得程序性能大幅度降低 例如下面例子 xff0c 在rdd13 count 时将触发一次从rdd1开始到r
  • 【Java】自带sort库使用

    Arrays sort arr span class token keyword public span span class token keyword class span span class token class name mai
  • 如何使UDEV规则有效

    转 victor 64 X301A1 ls etc udev rules d 70 persistent cd rules 70 persistent net rules README 然后 xff1a victor 64 X301A1 s
  • 【堆】剑指 Offer 40. 最小的k个数

    输入整数数组 arr xff0c 找出其中最小的 k 个数 例如 xff0c 输入4 5 1 6 2 7 3 8这8个数字 xff0c 则最小的4个数字是1 2 3 4 示例 1 xff1a 输入 xff1a arr 61 3 2 1 k
  • 【堆】703. 数据流中的第K大元素

    设计一个找到数据流中第K大元素的类 xff08 class xff09 注意是排序后的第K大元素 xff0c 不是第K个不同的元素 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器 xff0c 它包含数据
  • 【Queue】简单使用

    java中LinkedList实现了Queue接口 xff0c 可以当作队列使用 添加元素 xff1a offer或add方法 xff0c add方法在失败的时候会抛出异常 不推荐 删除元素 xff1a remove和poll方法都是从队列
  • 【树】剑指 Offer 55 - I. 二叉树的深度

    题目 输入一棵二叉树的根节点 xff0c 求该树的深度 从根节点到叶节点依次经过的节点 xff08 含根 叶节点 xff09 形成树的一条路径 xff0c 最长路径的长度为树的深度 例如 xff1a 给定二叉树 span class tok
  • 【树】剑指 Offer 28. 对称的二叉树

    题目 请实现一个函数 xff0c 用来判断一棵二叉树是不是对称的 如果一棵二叉树和它的镜像一样 xff0c 那么它是对称的 例如 xff0c 二叉树 1 2 2 3 4 4 3 是对称的 span class token number 1
  • 【图】1042. 不邻接植花

    题目 有 N 个花园 xff0c 按从 1 到 N 标记 在每个花园中 xff0c 你打算种下四种花之一 paths i 61 x y 描述了花园 x 到花园 y 的双向路径 另外 xff0c 没有花园有 3 条以上的路径可以进入或者离开
  • 【LinkedList】基本操作、图的邻接表

    基本操作 创建 LinkedList span class token generics function span class token punctuation lt span Integer span class token punc
  • 【Python】配置文件configparser

    使用configparser模块读取模型参数 xff0c 设置config ini文件内容如下 xff0c train 和 savepath 分别为两个session span class token punctuation span tr
  • 【Python】生成随机字符串

    参考 span class token keyword import span random span class token keyword def span span class token function random str sp
  • 【动态规划】64. 最小路径和

    题目 给定一个包含非负整数的 m x n 网格 xff0c 请找出一条从左上角到右下角的路径 xff0c 使得路径上的数字总和为最小 说明 xff1a 每次只能向下或者向右移动一步 示例 输入 1 3 1 1 5 1 4 2 1 输出 7