数据结构与算法之动态规划: LeetCode 63. 不同路径 II (Ts, Py, Go版)

AT32F435/437开发实战:把SD卡变成U盘的完整指南(含源码解析) 本文提供了基于AT32F435/437微控制器将SD卡改造为U盘的完整实战指南。通过深入解析USB MSC协议与SDIO驱动的协同工作原理,详细介绍了硬件设计要点、软件架构融合、核心源码解析以及从编译到文件传输的完整调试流程,帮助开发者实现可靠的大容量存储设备扩展。 阅读详情

不同路径 II

描述

  • 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

  • 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

  • 网格中的障碍物和空位置分别用 1 和 0 来表示。

示例1

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例2

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

Typescript 版算法实现


1 )方案 1

function uniquePathsWithObstacles(obstacleGrid: number[][]): number {
  // 1. 获取当前矩阵的行和列
  const m = obstacleGrid.length // 行
  const n = obstacleGrid[0].length // 列
  // 2. 准备好最终的数据结构:初始化一个m x n的矩阵, 使用矩阵来计算
  const matrix: number[][] = new Array(m).fill(0).map(_ => new Array(n).fill(0));
  // 3. 遍历第一列,根据给定矩阵,初始化结果矩阵中第一列的值
  for (let i = 0; i < m && obstacleGrid[i][0] === 0; i++) {
    matrix[i][0] = 1
  }
  // 4. 遍历第一行,根据给定矩阵,初始化结果矩阵中第一行的值
  for (let i = 0; i < n && obstacleGrid[0][i] === 0; i++) {
    matrix[0][i] = 1
  }
  // 遍历原始矩阵这个二维数组,因为第一列和第一行已经遍历过了
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      // 中间有障碍物,直接跳出当前
      if (obstacleGrid[i][j] === 1) continue
      // 分解后的问题求解公式,
      matrix[i][j] = matrix[i - 1][j] + matrix[i][j - 1]
    }
  }
  // 最后一步存储的值
  return matrix[m - 1][n - 1]
}
  • 这个是官方示例,逆向思维,原矩阵中1是障碍物,0是可移动的位置
  • 为了方便计算, 我们通过一个新的矩阵来累加计算,反过来,可移动的为1,障碍物为0
  • 因为可移动的位置参与计算,障碍物不参与计算
  • 核心公式是:F(m*n) = F((m-1) * n) + F(m * (n - 1))
  • 动态规划就是从基础开始计算,直到逐步接近我们最终的目标,也就是最后的一个位置 matrix[m - 1][n - 1]
  • 我一开始没想到怎么做,看了官方示例,瞬间就明白了

2 )方案2

function uniquePathsWithObstacles(obstacleGrid: number[][]): number {
    const n = obstacleGrid.length; // 行
    const m = obstacleGrid[0].length; // 列
    // 只需要知道前一列的路径数即可, 大幅减少 空间复杂度
    const f: number[] = new Array(m).fill(0); // 用一个 一维数组来存储路径数量, 这是一个滚动数组

    f[0] = obstacleGrid[0][0] === 0 ? 1 : 0; // 起始位置的记录
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < m; j++) {
            if (obstacleGrid[i][j] === 1) {
                f[j] = 0;
                continue;
            }
            if (j - 1 >= 0 && obstacleGrid[i][j - 1] === 0) {
                f[j] += f[j - 1]; // // 当前格 为 左边一格f[j-1]和上边一格f[j](这里是自身之前)所决定
            }
        }
    }
    return f[m - 1]; // 返回一维数组的最后一个
}
  • 这里降低了空间复杂度,使用了滚动数组来处理的

Python3 版算法实现


1 ) 方案1

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        # 1. 获取当前矩阵的行和列  
        m = len(obstacleGrid)  # 行  
        n = len(obstacleGrid[0])  # 列  
        # 2. 准备好最终的数据结构:初始化一个m x n的矩阵, 使用矩阵来计算  
        matrix = [[0] * n for _ in range(m)]  
        
        # 3. 遍历第一列,根据给定矩阵,初始化结果矩阵中第一列的值  
        for i in range(m):  
            if obstacleGrid[i][0] == 0:  
                matrix[i][0] = 1  
            else:  
                break  # 如果遇到障碍物,则后续的行都不可达  
        
        # 4. 遍历第一行,根据给定矩阵,初始化结果矩阵中第一行的值  
        for j in range(n):  
            if obstacleGrid[0][j] == 0:  
                matrix[0][j] = 1  
            else:  
                break  # 如果遇到障碍物,则后续的列都不可达  
        
        # 遍历原始矩阵这个二维数组,因为第一列和第一行已经遍历过了  
        for i in range(1, m):  
            for j in range(1, n):  
                # 中间有障碍物,直接跳出当前  
                if obstacleGrid[i][j] == 1:  
                    continue  
                # 分解后的问题求解公式  
                matrix[i][j] = matrix[i - 1][j] + matrix[i][j - 1]  
        
        # 最后一步存储的值  
        return matrix[m - 1][n - 1]

2 ) 方案2

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        n = len(obstacleGrid)  # 行数
        m = len(obstacleGrid[0])  # 列数
        
        # 使用一个一维数组来存储到达每一列底部的路径数量,这是一个滚动数组
        f = [0] * m
        
        # 起始位置的记录
        f[0] = 1 if obstacleGrid[0][0] == 0 else 0
        
        for i in range(n):
            for j in range(m):
                # 如果当前位置有障碍,则无法到达该位置,将路径数量设为0
                if obstacleGrid[i][j] == 1:
                    f[j] = 0
                    continue
                # 如果当前位置没有障碍,并且其左侧位置也没有障碍
                # 则当前位置的路径数量等于左侧位置的路径数量(因为可以从左侧到达当前位置)
                # 注意:这里没有显式地加上来自上方的路径数量,因为f[j]在上一轮外层循环中已经被更新为上一行的结果了
                # 由于我们是按行遍历的,所以f[j]在更新时自动地“知道”了上一行的路径数量(如果上方位置无障碍)
                if j - 1 >= 0 and obstacleGrid[i][j - 1] == 0:
                    f[j] += f[j - 1]
        
        # 返回到达网格右下角的路径数量
        return f[m - 1]

Golang 版算法实现


1 ) 方案1

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
	// 1. 获取当前矩阵的行和列  
	m := len(obstacleGrid)  
	if m == 0 {  
		return 0  
	}  
	n := len(obstacleGrid[0])  
  
	// 2. 准备好最终的数据结构:初始化一个m x n的矩阵, 使用矩阵来计算  
	matrix := make([][]int, m)  
	for i := 0; i < m; i++ {  
		matrix[i] = make([]int, n)  
	}  
  
	// 3. 遍历第一列,根据给定矩阵,初始化结果矩阵中第一列的值  
	for i := 0; i < m; i++ {  
		if obstacleGrid[i][0] == 1 {  
			break  
		}  
		matrix[i][0] = 1  
	}  
  
	// 4. 遍历第一行,根据给定矩阵,初始化结果矩阵中第一行的值  
	for j := 0; j < n; j++ {  
		if obstacleGrid[0][j] == 1 {  
			break  
		}  
		matrix[0][j] = 1  
	}  
  
	// 遍历原始矩阵这个二维数组,因为第一列和第一行已经遍历过了  
	for i := 1; i < m; i++ {  
		for j := 1; j < n; j++ {  
			// 中间有障碍物,直接跳出当前  
			if obstacleGrid[i][j] == 1 {  
				continue  
			}  
			// 分解后的问题求解公式  
			matrix[i][j] = matrix[i-1][j] + matrix[i][j-1]  
		}  
	}  
  
	// 最后一步存储的值  
	return matrix[m-1][n-1]  
}

2 )方案2

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
	n := len(obstacleGrid) // 行数
	if n == 0 {
		return 0
	}
	m := len(obstacleGrid[0]) // 列数
 
	// 使用一个一维数组来存储到达每一列底部的路径数量,这是一个滚动数组
	f := make([]int, m)
 
	// 起始位置的记录
	if obstacleGrid[0][0] == 0 {
		f[0] = 1
	}
 
	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			// 如果当前位置有障碍,则无法到达该位置,将路径数量设为0
			if obstacleGrid[i][j] == 1 {
				f[j] = 0
				continue
			}
			// 如果当前位置没有障碍,并且其左侧位置也没有障碍
			// 则当前位置的路径数量等于左侧位置的路径数量(因为可以从左侧到达当前位置)
			// 注意:这里没有显式地加上来自上方的路径数量,因为f[j]在上一轮外层循环中已经被更新为上一行的结果了
			if j-1 >= 0 && obstacleGrid[i][j-1] == 0 {
				f[j] += f[j-1]
			}
			// 如果当前位置是第一列且没有障碍,则它的路径数量应该保持不变(因为第一列只能从上方到达)
			// 但由于我们是从上到下、从左到右遍历的,这个条件实际上已经被隐含地处理了
			// 即:f[0] 在开始时已经被正确设置,且在后续遍历中不会被左侧的值影响(因为j-1会小于0)
		}
	}
 
	// 返回到达网格右下角的路径数量
	return f[m-1]
}
PX4环境git submodule update --init --recursive失败的解决办法 最近开始搭建PX4环境,搭建是需要从github下载工程,然后使用语句git submodule update --init --recursive更新工程子模块,但往往由于网络原因这一步需要很久,甚至会失败。因为github是外网,在上面下载代码会受到很大限制,往往会出现下面的问题: 即无法连接到github,查阅了相关资料后,我发现了解决更新子模块失败的方法: 1.打开你下载的PX4源码,即Firmware文件夹,找到其中的.gitmodules,如下图: 2…gitmodules有以上格式,path 阅读详情

相关推荐

Redis Lua引擎UAF漏洞CVE-2025-49844深度剖析与复现实践

内存安全是软件系统稳定性的基石,其核心原理在于确保程序对内存的访问始终处于合法、受控的状态。在C/C++等手动管理内存的语言中,Use-After-Free(释放后使用)是一种典型的高危内存安全漏洞,它源于已释放的内存区域仍被程序指针引用,导致数据混乱或程序崩溃。这类漏洞的技术价值在于其往往能突破高级语言的安全边界,直接威胁进程本身,危害等级极高,常见于数据库、浏览器等核心基础设施。在Redis这样的高性能内存数据库中,其内置的Lua脚本引擎为复杂操作提供了强大支持,但同时也引入了沙箱环境下的复杂内存对象生

weixin_42530732的博客 365

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

Comsol 弧形声学换能器声聚焦仿真

1. 弧度和曲率半径:弧形声学换能器的形状和曲率半径对声聚焦效果有重要影响。通常,较小的曲率半径和较大的弧度可以实现更强的声聚焦效果。弧形声学换能器声聚焦是指将声波能量集中在弧形声学换能器的特定区域内,以实现更强的声场强度和分辨率。4. 数值仿真和优化:使用声学仿真软件进行数值仿真可以帮助设计和优化弧形声学换能器的声聚焦效果。通过调整几何参数、材料特性和激励信号等参数,可以模拟和优化声聚焦效果。2. 激励信号:通过调整激励信号的频率和幅值,可以实现声波在弧形声学换能器中的聚焦效果。

声学黑洞仿真工作室 1619

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374

LoRa项目实战:手把手教你为ESP32选配和焊接天线(从PCB到信号测试)

本文详细介绍了为ESP32选配和焊接LoRa天线的全流程,包括天线选型、PCB布局设计、焊接工艺及信号测试。重点解析了PCB板载天线、导线天线和陶瓷贴片天线的适用场景与性能特点,并提供专业的焊接技巧和信号测试方案,帮助开发者优化LoRa模块的无线通信性能。

weixin_30470643的博客 395

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

农夫、羊、狼、菜的过河问题 问题描述 角色:农夫,羊,狼,菜 条件1:船很小,只能装下农夫和其他一个角色 条件2:无人看管,羊吃菜,狼吃羊 问:如何让其他三种角色被农夫平安带着过河? 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 ) 先渡狼,人回来再渡菜,人回来再渡羊 2 ) 先渡菜,人回来再渡狼,人回来再渡羊 以上两种很好想到,而且我们可以知道羊这种角色是不能先渡河过去的,羊需要最后再渡 如果先渡了羊了,之后再渡任何其他角色,都要将羊带回来 可以参考小游戏:http://gameschool

Wang的专栏 3312

基于单片机的室内空气质量监控系统设计

摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 方案选择 3 1.2 系统控制原理 4 2系统硬件设计 5 2.1 单片机的选择与设计 5 2.2 温湿度模块设计 6 2.3 甲醛采集模块设计 8 2.4 显示器模块设计 9 2.5 按键模块设计 10 2.6 报警模块设计 11 2.7 加湿及风扇模块设计 11 3系统软件设计 13 3.1 总流程方案设计 13 3.2 温湿度获取的软件设计 14 3.3 液晶屏LCD1602的软件设计 15 4系统调试 13 4

Q_1928499906的博客 2702

数据结构与算法笔记:图搜索之DFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) !!!本文详解!!! 深度优先搜索DFS 深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 同样,我们可以通过一个故事来开始 在古希腊神话中, Ariadne是Crete的国王Minos的公主,她给忒修斯(Theseus)一个线团 使得忒修斯成功进入迷宫杀死牛头怪兽,但事后忒修斯抛弃了她 这是一个有道德意义的故事又或者存在不同的版本, 但不是我们的研究的对象

Wang的专栏 3119

S4-FPGA-K7板级原理图硬件实战

xilinx K7板级硬件实战

weixin_66510961的博客 6156

SAP_PP模块中MRP中信号灯简介

一、信号灯的作用二、常见的信号灯颜色及含义三、信号灯的来源四、常见场景示例示例1:物料满足所有需求示例2:生产订单已延迟示例3:缺料或未产生计划订单五、相关事务码参考六、如何应对红色或黄色信号灯?七、前台操作说明在 SAP PP 模块中,**MRP(物料需求计划)运行结果中的“信号灯”是一种非常直观的可视化提示工具,用于帮助用户快速识别物料计划是否存在异常或需要关注的问题。这些信号灯通常出现在MD04(库存/需求清单)、MD05(单物料MRP清单)、MD07(MRP列表)**等事务代码的界面中。

我小时候很黑的博客 648

数据结构与算法笔记:计算思维之人鬼渡河问题

人鬼渡河问题 1 ) 问题描述 目标:将东岸的3人3鬼通过一只小船安全转移到西岸,希望摆渡次数尽可能少 条件 船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼) 无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人将被鬼吃掉 怎样渡河的大权掌握在人的手中 说明:划船的时间忽略不计。船一靠岸即将船与岸视为一体,人和鬼即使还没有下 船也视为已上岸 任务:编写程序,求出一种渡河方案 备注:图片托管于github,请确保网络的可访问性 2 ) 分析 目标是找

Wang的专栏 2447

YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 5499

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

1 ) 方案1:模拟。2 ) 方案2:递归。

Wang的专栏 2270

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数据结构与算法笔记:计算思维之下楼梯台阶和象棋跳马问题

下台阶问题 1 ) 问题描述 从楼上走到楼下共有 h 个台阶,每一步有三种走法 走一个台阶; 走二个台阶; 走三个台阶。 问:一共可以走出多少种方案? 即共要多少步? 每一步走几级台阶? 2 ) 分析 初始思路 我们根据题目给定的场景,先简单模拟一下,设定 h=4h=4h=4 备注:图片托管于github,请确保网络的可访问性 如上图所示, 这里有4阶楼梯, 红色数字代表每一步走几级台阶 这里枚举了4层台阶的所有可能情况, 但是不管具体有几级台阶,下

Wang的专栏 2111

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Python笔记:滑动验证码的识别算法

概述 用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作 使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 关于极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合...

Wang的专栏 2103

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据结构与算法之堆: LeetCode 295. 数据流的中位数 (Ts版)

/ 返回 1.5 ((1 + 2) / 2)中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。3 ) 方案3:有序集合 + 双指针。2 ) 方案2:优先队列-优化版。1 ) 方案1:优先队列。

Wang的专栏 1907

数据结构与算法笔记:计算思维之谁做的好事与刑侦作案问题

谁做的好事 清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 已知:三个人说的是真话,一个人说的是假话。 现在请你根据这些信息,编写程序找出做了好事的人。 分析 将四个人说的四句话(自然语言)转换成计算机可以计算的式子, 可使用循环枚举的方式来判断 (1) 思路一:通过字符表示人 先定义一个字符变量 thisman 表示要寻找的做了好事的人的“名字(代号)”(A、B、C、D),即 char this

Wang的专栏 1829

数据结构与算法笔记:图搜索之BFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) 广度优先搜索BFS 我们可以用比喻来说明广度优先搜索算法 在一片草木枯黄的深秋草原上,在草原的某一处出现了一处野火 一开始的时候野火集中于一点之上,在这点野火耗尽当前植被变成灰烬之前点燃了周围的植被 比如节点s是初始火种,假设我们手中有一个秒表,每过1秒,我们的大火会向外迈进一步 这个过程只能向外,不能向内,因为只能点燃植被,不能把灰烬点燃 蓝色的点是即将变为灰烬的点,红色的点是刚被点燃的点,灰色的圆形或

Wang的专栏 1791

数据结构与算法之动态规划: LeetCode 1494. 并行课程 II (Ts版)

给你一个整数 n 表示某所大学里课程的数目,编号为 1 到 n ,数组 relations 中, relations[i] = [xi, yi] 表示一个先修课的关系,也就是课程 xi 必须在课程 yi 之前上。解释:上图展示了题目输入的图。一个最优方案是:第一学期上课程 2 和 3,第二学期上课程 4 ,第三学期上课程 1 ,第四学期上课程 5。然后第二个学期上课程 1 ,第三个学期上课程 4。在一个学期中,你 最多 可以同时上 k 门课,前提是这些课的先修课在之前的学期里已经上过了。

Wang的专栏 1749

数据结构与算法笔记:求直方图最大面积算法分析

直方图最大面积 问题描述 有n列的直方图,第j列高度为hjh_jhj​, 求一个面积最大的子矩阵 备注:图片托管于github,请确保网络的可访问性 格式要求 输入第一行正整数n,第二行n个空格隔开的非负整数 数据范围: 所有直方图的列不会超过30000 关键算法实现 1 ) 算法1:时间复杂度为: O(n3)O(n^3)O(n3)的实现 分析 矩形面积为底和高的乘积 底部从a到b,那么底边长为: b-a+1 高为:min{hi∣a≤i≤b}min \{h

Wang的专栏 1664

数据结构与算法之LRU: 实现 LRU 缓存算法功能 (Ts, Py, Go版)

LRU - Lease Recently Used 最近使用如果内存优先,只缓存最近使用的,删除 ‘沉睡’ 数据核心 api: get set分析。

Wang的专栏 1599

数据结构与算法之贪心: LeetCode 455. 分饼干 (Ts, Py, Go版)

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。2 )排序 + 双指针 + 贪心。1 )排序 + 遍历。

Wang的专栏 1566

动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100

将一个复杂问题拆分成多个规模更小的子问题,通过保存子问题的计算结果,避免重复计算,最终得到原问题的答案。先看一个经典问题。dp[i] = 以第 i 个元素结尾的最优结果例如最长递增子序列。最长递增子序列不一定以最后一个元素结尾,因此必须遍历整个数组取最大值。dp[i] = 前 i 个元素的最优结果这种情况下,最终答案通常就是dp[n]。关键在于理解 dp 数组的定义。动态规划的核心并不是背诵某个固定模板,而是建立正确的状态定义,并通过状态转移方程解决问题。dp[i] 或 dp[i][j] 表示什么?

zengjiajun2006的博客 884

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 187

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 214
上一篇: 数据结构与算法之动态规划: LeetCode 198. 打家劫舍 (Ts, Py, Go版)
下一篇: 数据结构与算法之动态规划: LeetCode 787. K 站中转内最便宜的航班 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值