力扣hot100题解(python版91-95题)

91、不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例 1:

img

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

思路解答:

  1. 初始化 dp 数组,将第一行和第一列的值都设为 1,因为机器人只能向右或向下移动,所以第一行和第一列的位置只有一种到达方式。
  2. 对于其他位置 dp [ i ] [ j ] [i][j] [i][j],可以从上方位置 dp [ i − 1 ] [ j ] [i-1][j] [i1][j] 或左方位置 dp [ i ] [ j − 1 ] [i][j-1] [i][j1] 到达,因此有 dp [ i ] [ j ] [i][j] [i][j] = dp [ i − 1 ] [ j ] [i-1][j] [i1][j] + dp [ i ] [ j − 1 ] [i][j-1] [i][j1]
  3. 最终返回 dp [ m − 1 ] [ n − 1 ] [m-1][n-1] [m1][n1],即到达右下角的不同路径数。
def uniquePaths(m: int, n: int) -> int:
    dp = [[1] * n for _ in range(m)]

    for i in range(1, m):
        for j in range(1, n):
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

    return dp[m - 1][n - 1]

92、最小路径和

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

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

示例 1:

img

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

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200

思路解答:

dp [ i ] [ j ] [i][j] [i][j] 表示从左上角到达网格的第 i 行、第 j 列位置的最小路径和。

  1. 初始化 dp 数组,将第一行和第一列的值分别累积计算,因为在这两条边上,路径只能沿着一条直线移动,所以到达每个位置的最小路径和就是前一个位置的最小路径和加上当前位置的值。
  2. 对于其他位置 dp [ i ] [ j ] [i][j] [i][j],可以从上方位置 dp [ i − 1 ] [ j ] [i-1][j] [i1][j] 或左方位置 dp [ i ] [ j − 1 ] [i][j-1] [i][j1] 到达,选择路径和较小的那个作为当前位置的最小路径和,即 dp [ i ] [ j ] [i][j] [i][j] = min(dp [ i − 1 ] [ j ] [i-1][j] [i1][j], dp [ i ] [ j − 1 ] [i][j-1] [i][j1]) + grid [ i ] [ j ] [i][j] [i][j]
  3. 最终返回 dp [ m − 1 ] [ n − 1 ] [m-1][n-1] [m1][n1],即从左上角到达右下角的最小路径和。
def  minminPathSum(grid: list[list[int]]) -> int:
    m, n = len(grid), len(grid[0])

    for i in range(1, m):
        grid[i][0] += grid[i - 1][0]

    for j in range(1, n):
        grid[0][j] += grid[0][j - 1]

    for i in range(1, m):
        for j in range(1, n):
            grid[i][j] += min(grid[i - 1][j], grid[i][j - 1])

    return grid[m - 1][n - 1]

93、最小回文字符串

给你一个字符串 s,找到 s 中最长的回文子串,如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

思路解答:

dp [ i ] [ j ] [i][j] [i][j] 表示从索引 i 到 j 的子串是否为回文子串。

  1. 初始化 dp 数组,将所有长度为 1 的子串都标记为回文子串(即 dp [ i ] [ i ] [i][i] [i][i] = True)。
  2. 对于长度大于 1 的子串,遍历所有可能的子串长度和起始索引,更新 dp 数组。
  3. 在更新 dp 数组时,如果 s[i] == s[j] 且 dp [ i + 1 ] [ j − 1 ] [i+1][j-1] [i+1][j1] 是回文子串(即 i 和 j 之间的子串是回文串),则 dp [ i ] [ j ] [i][j] [i][j] 也是回文子串。
  4. 记录最长的回文子串的起始索引和长度,最终返回该子串。
def  minminCut(s: str) -> int:
    n = len(s)
    dp = [[False] * n for _ in range(n)]
    start = 0
    max_length = 1

    # 单个字符一定是回文串
    for i in range(n):
        dp[i][i] = True

    # 遍历所有可能的子串长度和起始索引
    for length in range(2, n + 1):
        for i in range(n - length + 1):
            j = i + length - 1
            if length == 2 and s[i] == s[j]:
                dp[i][j] = True
            elif s[i] == s[j] and dp[i + 1][j - 1]:
                dp[i][j] = True
            if dp[i][j] and length > max_length:
                start = i
                max_length = length

    return s[start:start + max_length]

94、最长公共子序列

给定两个字符串 text1text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace""abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

示例 2:

输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3 。

示例 3:

输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0 。

提示:

  • 1 <= text1.length, text2.length <= 1000
  • text1text2 仅由小写英文字符组成。

思路解答:

dp [ i ] [ j ] [i][j] [i][j] 表示 text1 的前 i 个字符和 text2 的前 j 个字符的最长公共子序列的长度。

  1. 初始化一个 (m+1) x (n+1) 的二维数组 dp,其中 m 和 n 分别是 text1 和 text2 的长度。
  2. 对于 dp 数组的边界情况,即当 i=0 或 j=0 时,最长公共子序列的长度为 0。
  3. 对于其他情况,如果 text1[i-1] 等于 text2[j-1],说明当前字符可以作为最长公共子序列的一部分,此时 dp [ i ] [ j ] [i][j] [i][j] = dp [ i − 1 ] [ j − 1 ] [i-1][j-1] [i1][j1] + 1。
  4. 如果 text1[i-1] 不等于 text2[j-1],则最长公共子序列的长度为 max(dp [ i − 1 ] [ j ] [i-1][j] [i1][j], dp [ i ] [ j − 1 ] [i][j-1] [i][j1]),即取删除 text1[i-1] 或 text2[j-1] 后的最长公共子序列的长度。
  5. 最终返回 dp [ m ] [ n ] [m][n] [m][n],即 text1 和 text2 的最长公共子序列的长度。
def  longestCommonSubsequence(text1: str, text2: str) -> int:

    m, n = len(text1), len(text2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if text1[i - 1] == text2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

    return dp[m][n]

95、编辑距离

给你两个单词 word1word2请返回将 word1 转换成 word2 所使用的最少操作数

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

提示:

  • 0 <= word1.length, word2.length <= 500
  • word1word2 由小写英文字母组成

思路解答:

dp [ i ] [ j ] [i][j] [i][j] 表示将 word1 的前 i 个字符转换成 word2 的前 j 个字符所需要的最少操作数。

  1. 初始化一个 (m+1) x (n+1) 的二维数组 dp,其中 m 和 n 分别是 word1 和 word2 的长度。
  2. 对于 dp 数组的边界情况,当 i=0 时,表示将一个空字符串转换成 word2 的前 j 个字符需要插入 j 次操作;当 j=0 时,表示将 word1 的前 i 个字符转换成一个空字符串需要删除 i 次操作。
  3. 对于其他情况,分为三种情况:
    • 如果 word1[i-1] 等于 word2[j-1],则不需要进行操作,dp [ i ] [ j ] [i][j] [i][j] = dp [ i − 1 ] [ j − 1 ] [i-1][j-1] [i1][j1]
    • 如果 word1[i-1] 不等于 word2[j-1],则可以进行插入、删除或替换操作,取这三种操作的最小值加一,即 dp[i][j] = min(dp [ i − 1 ] [ j ] [i-1][j] [i1][j], dp [ i ] [ j − 1 ] [i][j-1] [i][j1], dp [ i − 1 ] [ j − 1 ] [i-1][j-1] [i1][j1]) + 1。
  4. 最终返回 dp [ m ] [ n ] [m][n] [m][n],即将 word1 转换成 word2 所需要的最少操作数。
def minminDistance(word1: str, word2: str) -> int:
    m, n = len(word1), len(word2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]

    for i in range(m + 1):
        dp[i][0] = i

    for j in range(n + 1):
        dp[0][j] = j

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if word1[i - 1] == word2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1]
            else:
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1

    return dp[m][n]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/479178.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java分割等和子集(力扣Leetcode416)

分割等和子集 力扣原题链接 给你一个只包含正整数的非空数组nums。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] …

【深度学习基础知识】IOU、GIOU、DIOU、CIOU

这里简单记录下IOU及其衍生公式。   为了拉通IOU及其衍生版的公式对比&#xff0c;以及方便记忆&#xff0c;这里用一个统一的图示来表示出所有的参数 【&#xff21;】目标框的区域【&#xff22;】预测框的区域【&#xff23;】&#xff21;与&#xff22;的交集【&#xff…

关于TEMU 亚马逊美国哺乳枕(Nursing Pillow)法规16 CFR 1242介绍

美国首个哺乳枕法规16 CFR 1242发布 美国消费品安全委员会CPSC于2023年9月26日在联邦公报上发布了哺乳枕新法规16 CFR 1242的草案&#xff0c;旨在降低哺乳枕使用带来的伤害和死亡风险。该法规草案提到了在使用哺乳枕时由于婴儿睡着或无人看护而导致的窒息、陷落和跌落风险。在…

2024:RAG年

如果 2023 年都是关于 ChatGPT 和 Llama-2 等基础LLM&#xff0c;那么我的预测是 2024 年将是关于检索增强一代&#xff08;RAG&#xff09;的。 在这篇博文中&#xff0c;我阐述了为什么 RAG 将在 2024 年飞速发展&#xff0c;不仅是企业采用率&#xff0c;而且消费者采用率也…

BigDecimal类的使用,用于精确计算任意精度的数字

BigDecimal类 BigDecimal 是 Java 中用于精确表示任意精度的十进制数的类。在很多情况下,使用基本数据类型(如 double 或 float)进行浮点数计算可能会导致精度丢失或舍入错误。BigDecimal 提供了一种更精确的解决方案,可以处理需要高精度计算的场景,比如财务应用或科学计算…

记录解决问题--activiti8.2 流程图图片由png改为svg前端不显示图片问题

1.说明 如果是vue svg显示&#xff0c;请查阅其他标准资料&#xff0c;类似使用svg标签。我这里讲的另外一种情况&#xff0c;链接返回的是svg文件&#xff0c;需要用v-html显示图片。 2.activiti6流程图图片格式 ①png格式。可以查看链接返回&#xff0c;以png开头。 ②前端…

蓝桥杯练习——神秘咒语——axios

目标 完善 index.js 中的 TODO 部分&#xff0c;通过新增或者修改代码&#xff0c;完成以下目标&#xff1a; 点击钥匙 1 和钥匙 2 按钮时会通过 axios 发送请求&#xff0c;在发送请求时需要在请求头中添加 Authorization 字段携带 token&#xff0c;token 的值为 2b58f9a8-…

适合新生儿的奶瓶有哪些?五款高分新生儿奶瓶分享!

每一个有新生儿的家庭都一定会挑选奶瓶&#xff0c;但是因为市面有太多品牌和款式&#xff0c;让大家难以挑选&#xff0c;更为重要的是还有可能会不小心选到劣质的产品&#xff0c;不仅奶嘴的仿真度差、易胀气&#xff0c;还可能高温消毒后散发有害物质&#xff01;那么新生儿…

力扣 字符串解码

维护一个放数字的栈&#xff0c;一个放字母的栈 遇到[把数字和字母入栈&#xff0c;遇到]把当前字母循环加上数字栈头遍的字母栈头 class Solution { public:string decodeString(string s) {string ans"";stack<int>sz;stack<string>zm;里面是string …

2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化

目录 前言 AI辅助研发的技术进展 行业应用案例 医药行业 汽车行业 电子行业 面临的挑战与机遇 技术挑战 伦理问题 数据安全 机遇和解决方案 未来趋势预测 1. 深度融合AI与研发流程 2. 智能研发平台的崛起 3. 强化AI与人类智慧的融合 前言 当谈到人工智能&#xff…

论文笔记:Llama 2: Open Foundation and Fine-Tuned Chat Models

导语 Llama 2 是之前广受欢迎的开源大型语言模型 LLaMA 的新版本&#xff0c;该模型已公开发布&#xff0c;可用于研究和商业用途。本文记录了阅读该论文的一些关键笔记。 链接&#xff1a;https://arxiv.org/abs/2307.09288 1 引言 大型语言模型&#xff08;LLMs&#xff…

Linux:http协议初步认识

文章目录 OSI七层模型http协议域名路径信息请求和响应 编写一个httpserver OSI七层模型 在结束了前面对于序列化反序列化等内容的学习后&#xff0c;重新回到对于OSI模型的部分 如上所示的是对于OSI接口的示意图&#xff0c;在这当中可以看到会话层的概念&#xff0c;会话层的…

CMake学习(下)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…

携程旅行web逆向

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章…

C语言:volatile关键字讲解

读音&#xff1a;vaoletail C语言中的volatile关键字是一个重要的类型修饰符&#xff0c;它用于声明一个变量具有“易变性”&#xff0c;即可能在编译器无法察觉的情况下被改变其值。Volatile意思是“易变的”&#xff0c;应该解释为“直接存取原始内存地址”比较合适。 “易变…

【高质快刊】中科院1区TOP,最新案例仅2个月14天录用!进展超顺,即将截稿!

&#xff08;一&#xff09;期刊简介概况 【期刊类型】能源工程类SCIE&EI 【出版社】ELSEVIER出版社 【期刊概况】IF&#xff1a;11.0-12.0&#xff0c;JCR1区&#xff0c;中科院1区TOP 【预警情况】2020-2024年无预警记录 【收录年份】1977年被WOS数据库收录 【年发…

【python绘图colorbar对齐】

[Toc]# 1、问题描述 python在绘图过程中&#xff0c;可能会出现colorbar高度与主图不匹配情况&#xff0c;需要进行调整&#xff0c;使得与主图高度对齐&#xff0c;使图像更美观。示例&#xff1a;colorbar位置高于主图 2、解决方法 通过调整shrink参数匹配对齐,pad调整x轴…

【CPP】C++11多线程

thread类 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff0c;使得C在并行编程时不需要依赖第三方库&#xff0c…

ARM中断实验

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI-…

Linux-线程同步

文章目录 前言一、为什么要线程同步&#xff1f;二、线程同步pthread_cond_initpthread_cond_destroypthread_cond_wait、pthread_cond_signal和 pthread_cond_broadcast 三、示例代码 前言 上节课学习了线程互斥&#xff0c;这节课针对线程互斥内容在做进一步的补充和完善&am…