力扣hot100题解(python版81-90题)

81、爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

思路解答:

到达第 i 阶楼梯的方法数等于到达前一阶(i-1)和前两阶(i-2)的方法数之和

def climbStairs(n: int) -> int:
    if n == 1:
        return 1

    dp = [0] * (n + 1)
    dp[0] = dp[1] = 1

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

    return dp[n]
 
 更简洁写法:
     def climbStairs(n: int) -> int:
        if n == 1:
        	return 1
        a, b = 1, 1
        for _ in range(n - 1):
            a, b = b, a + b
        return b

82、杨辉三角

给定一个非负整数 *numRows,*生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

img

示例 1:

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

示例 2:

输入: numRows = 1
输出: [[1]]

提示:

  • 1 <= numRows <= 30

思路解答:

  1. 对于每一行 i,生成一个长度为 i+1 的列表 row,其中第一个和最后一个元素为 1。
  2. 对于每一行的第 2 到倒数第 2 个位置,result[i][j] = result[i-1][j-1] + result[i-1][j],即当前位置的值等于上一行对应位置和前一个位置的值之和。
  3. 将生成的 row 加入 result 中。
  4. 返回生成的 result
def generate(numRows: int) -> list[list[int]]:

    result = []

    for i in range(numRows):
        row = [1] * (i + 1)
        if i > 1:
            for j in range(1, i):
                row[j] = result[i - 1][j-1] + row[i - 1][j]
        result.append(row)

    return result

83、打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

思路解答:

dp[i] 表示偷盗前 i 个房屋时能够获得的最大金额。

动态规划的转移方程为 dp[i] = max(dp[i-1], dp[i-2] + nums[i]),即在第 i 个房屋时,选择偷取当前房屋或者不偷取当前房屋,取两者的最大值作为当前的最优解。

最终返回 dp[-1] 即可得到最终结果。

def rob(nums: list[int]) -> int:

    if not nums:
        return 0

    if len(nums) == 1:
        return nums[0]

    # 初始化动态规划数组
    dp = [0] * len(nums)
    dp[0] = nums[0]
    dp[1] = max(nums[0], nums[1])

    # 动态规划过程
    for i in range(2, len(nums)):
        dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])

    return dp[-1]

84、完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

示例 1:

输入:n = 12
输出:3 
解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13
输出:2
解释:13 = 4 + 9

提示:

  • 1 <= n <= 104

思路解答:

  1. 初始化一个长度为 n+1 的数组 dp,其中 dp[i] 表示和为 i 的完全平方数的最少数量。
  2. 对数组进行遍历,对于每个 i,初始化为一个较大的值,然后遍历所有小于等于 i 的完全平方数 j*j,更新 dp[i] = min(dp[i], dp[i-j*j]+1)
  3. 最终返回 dp[n] 即为所求的结果。
def numSquares(n: int) -> int:

    dp = [float('inf')] * (n + 1)
    dp[0] = 0

    for i in range(1, n + 1):
        for j in range(1, int(math.sqrt(i)) + 1):
            dp[i] = min(dp[i], dp[i - j * j] + 1)

    return dp[n]

85、零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

思路解答:

dp[i] 表示组成金额 i 所需的最少硬币个数。

初始时,除了金额为 0 的情况,其余金额的最少硬币个数都初始化为无穷大。然后遍历金额从 1 到 amount 的所有情况,对于每个金额,遍历所有硬币面额,更新最少硬币个数。

最终返回 dp[amount] 即可得到结果。

def coinChange(coins: list[int], amount: int) -> int:

    dp = [float('inf')] * (amount + 1)

    dp[0] = 0

    for i in range(1, amount + 1):
        for coin in coins:
            if i - coin >= 0:
                dp[i] = min(dp[i], dp[i - coin] + 1)

    return dp[amount] if dp[amount] != float('inf') else -1

86、单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
     注意,你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • swordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同

思路解答:

dp[i] 表示字符串 s 的前 i 个字符是否可以被字典中的单词拼接而成。

初始时,空字符串可以被拼接而成,因此 dp[0] = True。然后遍历字符串 s 的所有子串,如果存在一个位置 j,使得 dp[j] 为 True 且子串 s[j:i] 在字典中,那么 dp[i] 也为 True。

最终返回 dp[n] 即可得到结果。

def  wordBreak(s: str, wordDict: list[str]) -> bool:

    n = len(s)
    dp = [False] * (n + 1)
    dp[0] = True

    wordSet = set(wordDict)

    for i in range(1, n + 1):
        for j in range(i):
            if dp[j] and s[j:i] in wordSet:
                dp[i] = True
                break

    return dp[n]

87、最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

思路解答:

dp[i] 表示以第 i 个元素结尾的最长递增子序列的长度。

初始时,每个元素自身构成一个长度为 1 的递增子序列。然后遍历数组,对于每个位置 i,再次遍历之前的位置 j,如果 nums[i] > nums[j],则更新 dp[i] = max(dp[i], dp[j] + 1),表示以第 i 个元素结尾的最长递增子序列长度为之前最长子序列长度加 1 或自身。

最终返回 dp 中的最大值即可得到结果。

def  lengthOfLIS(nums: list[int]) -> int:
    if not nums:
        return 0

    n = len(nums)
    dp = [1] * n

    for i in range(1, n):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)

    return max(dp)

88、乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组

测试用例的答案是一个 32-位 整数。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

提示:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何前缀或后缀的乘积都 保证 是一个 32位 整数

思路解答:

max_num 表示以当前元素结尾的乘积最大子数组的乘积,min_num 表示以当前元素结尾的乘积最小子数组的乘积,result 表示全局最大乘积。

从数组的第二个元素开始遍历,对于每个元素,更新 max_num 和 min_num,同时更新 result 为全局最大值。在更新 max_num 和 min_num 的过程中,如果当前元素是负数,交换 max_num 和 min_num 的值,从而正确处理负数相乘的情况。

def maxmaxProduct(nums: list[int]) -> int:
    if not nums:
        return 0
    max_num, min_num, result = nums[0], nums[0], nums[0]
    for i in range(1, len(nums)):
        if nums[i] < 0:
            max_num, min_num = min_num, max_num

        max_num = max(nums[i], max_num * nums[i])
        min_num = min(nums[i], min_num * nums[i])

        result = max(max_num, result)

    return result

89、分割等和子集

给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100

思路解答:

  1. 首先计算整个数组的和 sum,如果 sum 是奇数,那么无法将数组分割成两个和相等的子集,直接返回 False。
  2. 如果 sum 是偶数,那么我们需要找到一个子集,其和为 sum/2。这样,问题就转化为在数组中找到一个子集,使得子集的和为 sum/2。
  3. 创建一个二维数组 dp,其中 dp[i][j] 表示在前 i 个元素中能否找到一个子集,使得子集的和为 j。
  4. 初始化 dp,将 dp[i][0](表示在前 i 个元素中找到和为 0 的子集)设为 True。
  5. 遍历数组 nums,对于每个元素 nums[i],遍历可能的和 j(从 sum/2 到 nums[i]),更新 dp[i][j]。
  6. 最终返回 dp [n][sum/2 的值。
def canPartition(nums: list[int]) -> bool:
    total_sum = sum(nums)
    if total_sum % 2 != 0:
        return False

    target = total_sum // 2
    n = len(nums)
    dp = [[False for _ in range(target + 1)] for _ in range(n + 1)]
    for i in range(n + 1):
        dp[i][0] = True

    for i in range(1, n + 1):
        for j in range(1, target + 1):
            if j < nums[i - 1]:
                dp[i][j] = dp[i - 1][j]
            else:
                dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]]

    return dp[n][target]

90、最长有效括号

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i]'('')'

思路解答:

  1. 创建一个栈,用于存储括号的索引位置。
  2. 初始化栈,将 -1 入栈,-1 的作用是用来计算有效括号子串的长度。
  3. 遍历字符串,遇到 ‘(’ 就将其索引入栈,遇到 ‘)’ 就弹出栈顶元素。
  4. 每次弹出栈顶元素时,计算当前有效子串的长度,更新最长有效子串的长度。
  5. 最终栈中剩下的元素就是无法匹配的括号的索引,通过这些索引计算最长有效子串的长度。
def  longestlongestValidParentheses(s: str) -> int:

    stack = []
    stack.append(-1)
    max_length = 0

    for i in range(len(s)):
        if s[i] == '(':
            stack.append(i)
        else:
            stack.pop()
            if len(stack) == 0:
                stack.append(i)
            else:
                max_length = max(max_length, i - stack[-1])

    return max_length

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

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

相关文章

如何正确看待竞争对手

很多人一天到晚的抱怨说实体经济不行啦&#xff0c;互联网经济也不行啦&#xff0c;我跟你说&#xff0c;抱怨没有用&#xff0c;你抱怨&#xff0c;这个时代是这样&#xff0c;不抱怨它也是这样&#xff0c;你抱怨&#xff0c;它也在&#xff0c;你不抱怨它还在。不是实体经济…

基于springboot+vue的毕业论文管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

基于SpringBoot的网上订餐系统

技术&#xff1a;springbootvuemysql 一、系统背景 随着我国经济的飞速发展&#xff0c;人们的生活速度明显加快&#xff0c;在餐厅吃饭排队的情况到处可见&#xff0c;近年来由于新兴IT行业的空前发展&#xff0c;它与传统餐饮行业也进行了新旧的结合&#xff0c;很多餐饮商户…

ensp不同vlan间的互相通信

关于不同vlan之间的通信&#xff0c;本章做了最简洁的案例&#xff0c;表示说明 1. 网段设置 1.1 划分四个不同 的 vlan vlan网段vlan10192.168.10.254 /24vlan20192.168.20.254 /24vlan30192.168.30.254 /24vlan40192.168.40.254 /24 1.2 SW1的配置 #进入视图 sys #更改交…

微调alpaca-lora遇到的一些问题

1、环境简介 环境&#xff1a; 系统&#xff1a;Ubuntu torch&#xff1a;2.2.1 python&#xff1a;3.10 gpu&#xff1a;V100 16g peft&#xff1a;0.9.0 使用PEFT中的lora方式微调llama-2-7b-hf&#xff0c;项目地址&#xff1a;alpaca-lora 2、混合精度训练Tensor相互计算会…

第十九章 TypeScript 装饰器Decorator

Decorator 装饰器是一项实验性特性&#xff0c;在未来的版本中可能会发生改变 它们不仅增加了代码的可读性&#xff0c;清晰地表达了意图&#xff0c;而且提供一种方便的手段&#xff0c;增加或修改类的功能 若要启用实验性的装饰器特性&#xff0c;你必须在命令行或tsconfig…

Springboot+vue的高校教师科研管理系统+数据库+报告+免费远程调试

项目介绍: Javaee项目&#xff0c;springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的高校教师科研管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

THM学习笔记—Bounty Hacker

nmap扫描&#xff0c;扫了一大堆但只有三个端口是开放的 试试ftp是否可以匿名登录 可以匿名登录&#xff0c;把里面的文件下载下来 查看里面的内容&#xff0c;猜lin为用户名&#xff0c;locks.txt为密码列表&#xff0c;使用hydra进行ssh登录。 找到密码了&#xff0c;进行ssh…

【Mybatis整合mysql之Json类型属性适配手把手】

【Mybatis整合mysql之Json类型属性适配&&手把手】 场景 JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前&#xff0c;只能通过字符类型&#xff08;CHAR&#xff0c;VARCHAR 、TEXT或LONGTEXT &#xff09;来保存 JSON 文档。在开发中发现&#xff0c;Mybatis查询…

AWS监控,AWS 性能监控工具

监控云部署的性能是 IT 环境正常运行的内在条件。AWS 云是一个架构良好的框架&#xff0c;管理员可以使用专用的AWS 性能监控工具增强服务的功能。执行AWS监视是为了跟踪在AWS环境中积极运行的应用程序工作负载和资源。AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上…

电子证书查询系统如何制作证书?

1、制作空白证书&#xff1a;网上找一张证书背景图&#xff0c;用PPT工具或photoshop等图片处理工具&#xff0c;将证书上固定的文字打上&#xff0c;有公章的话贴上电子公章&#xff0c;不固定的内容留空白。 2、制作电子证书&#xff1a;上传前一步制作好的空白证书&#xf…

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…

moviepy简介及使用教程

moviepy简介及基本概念 MoviePy 是一个用于视频编辑的 Python 库&#xff0c;使用户能够处理、编辑和操作视频文件。这个库允许你剪辑视频、添加文本、合并视频剪辑&#xff0c;以及应用各种效果和转换。它建立在 NumPy、imageio 和 Decorator 等库的基础上&#xff0c;使得在…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行&#xff0c;--name指定容器…

点餐小程序开发:如何通过抽奖与消费者互动

随着科技的发展&#xff0c;越来越多的商家开始使用点餐小程序来提升自己的服务质量和效率。然而&#xff0c;仅仅提供点餐服务并不能满足消费者的需求&#xff0c;他们还需要一种方式来增加与商家的互动&#xff0c;提高消费体验。抽奖活动就是一种非常有效的互动方式&#xf…

C++ stack和queue

什么是stack stack就是平常所说的栈&#xff0c;栈只能进行在固定的一端插入数据和删除数据的操作&#xff0c;也就是先进后出&#xff0c;后进先出 什么是queue queue是平常所说的队列&#xff0c;队列就像平常排队吃饭一样&#xff0c;先到的就有饭吃&#xff0c;只能从一端…

C语言每日一题07

一、题目 二、解析 逻辑与 &&、逻辑或 || 均有“短路”特性: 逻辑与&&“短路”&#xff1a;当逻辑与&&的左操作数为逻辑 “假“ 时&#xff0c;就足以判断该逻辑运算的结果为假了&#xff0c;故右操作数就不再被执行。 逻辑或||“短路”&#xff1a…

为什么大家都在“挺”鸿蒙?

试想某一天&#xff0c;应用软件能够在手机、电视、手表甚至汽车等设备上&#xff0c;实现无缝流转、纵享丝滑。 这不仅是畅想&#xff0c;而是鸿蒙正在布局的“遥遥领先”。 随着HarmonyOS NEXT鸿蒙星河版面向开发者开放申请、鸿蒙原生应用版图的基本成型&#xff0c;这个国…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——量子粒子群算法(QDPSO)

基于python语言&#xff0c;采用经典量子粒子群算法&#xff08;QDPSO&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前…

【解决navicat登录报 insufficient privileges 错误】

今天使用navicat sysdba角色登录报 insufficient privileges 以下是解决方案&#xff1a; 1、使用管理员身份打开cmd登录 sqlplus sys/admin as sysdba2、给system用户授权 grant sysdba to system;登录navicat