NeetCode刷题第19天(2025.1.31)

news2025/3/9 3:55:53

文章目录

  • 099 Maximum Product Subarray 最大乘积子数组
  • 100 Word Break 断字
  • 101 Longest Increasing Subsequence 最长递增的子序列
  • 102 Maximum Product Subarray 最大乘积子数组
  • 103 Partition Equal Subset Sum 分区等于子集和
  • 104 Unique Paths 唯一路径
  • 105 Longest Common Subsequence 最长公共 Subsequence

099 Maximum Product Subarray 最大乘积子数组

给定一个整数数组 nums,找到数组中乘积最大的子数组并返回它。
子数组是数组中连续的非空元素序列。
您可以假设输出将适合 32 位整数。

示例1:
Input: nums = [1,2,-3,4]
Output: 4

示例2:
Input: nums = [-2,-1]
Output: 2

解题1:
在这里插入图片描述
如果全部都是正数的话,他们的乘积一定是连续递增的。
在这里插入图片描述
这里可以每次都标记一个最大和一个最小值。有一个特殊情况,就是当0出现的时候,因为0乘以任何数都为0,所以这个时候我们要跳过0,把最大最小值从1开始重新计数。

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        res = max(nums)
        curMin, curMax = 1, 1

        for n in nums:
            if n == 0:
                curMin, curMax = 1, 1
                continue
            tmp = curMax * n
            curMax = max(tmp, n * curMin, n)
            curMin = min(tmp, n * curMin, n)
            res = max(res, curMax)
        return res

时间复杂度: O ( n 2 ) O(n²) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

100 Word Break 断字

给定一个字符串 s 和一个字符串 wordDict 字典,如果s可以分割成一个以空格分隔的字典单词序列,则返回true 。
您可以无限次重复使用字典中的单词。您可以假设所有字典单词都是唯一的。

示例1:
Input: s = "neetcode", wordDict = ["neet","code"]
Output: true
说明:返回 true,因为 “neetcode” 可以拆分为 “neet” 和 “code”。

示例2:
Input: s = "applepenapple", wordDict = ["apple","pen","ape"]
Output: true
说明:返回 true,因为 “applepenapple” 可以拆分为 “apple”、“pen” 和 “apple”。请注意,我们可以重复使用单词,也可以不使用所有单词。

示例3:
Input: s = "catsincars", wordDict = ["cats","cat","sin","in","car"]
Output: false

解题1: 动态规划(自下而上)
在这里插入图片描述
这里我们的决策树是按照wordDict中的词来划定每个节点的。

这里我们从后往前。当i=7的时候,sub_s=“e”,长度为1,而wordDict中的长度都大于他,显然不可能匹配到,所以dp[7]=False。
在这里插入图片描述

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [False] * (len(s) + 1)
        dp[len(s)] = True

        for i in range(len(s) - 1, -1, -1):
            for w in wordDict:
                if (i + len(w)) <= len(s) and s[i : i + len(w)] == w:
                    dp[i] = dp[i + len(w)]
                if dp[i]:
                    break
        return dp[0]

时间复杂度: O ( n ∗ m ∗ t ) O(n∗m∗t) O(nmt)
空间复杂度: O ( n ) O(n) O(n)
n 是字符串 s 的长度 , m 是 中的 wordDict 单词数, t 是 中 wordDict 任何单词的最大长度。

101 Longest Increasing Subsequence 最长递增的子序列

给定一个整数数组 nums ,返回最长的严格递增的子序列的长度。
子序列是一个序列,它可以通过删除一些元素或不删除元素而不更改其余字符的相对顺序来从给定序列派生。
例如, “cat” 是 “crabt” 的子序列。

示例1:
Input: nums = [9,1,4,2,3,3,7]
Output: 4
说明:最长递增的子序列是 [1,2,3,7],长度为 4。

示例2:
Input: nums = [0,3,1,3,2,3]
Output: 4

解题1: 动态规划(自下而上)
在这里插入图片描述
LIS[2]可能是1或者1+LIS[3],但是nums[2]<nums[3],所以1+LIS[3]就排除了。
在这里插入图片描述
在LIS[0]的时候,因为后面的都比1大,所以要把该位置和后面都进行相加,然后选择最大的。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        LIS = [1] * len(nums)

        for i in range(len(nums) - 1, -1, -1):
            for j in range(i + 1, len(nums)):
                if nums[i] < nums[j]:
                    LIS[i] = max(LIS[i], 1 + LIS[j])
        return max(LIS)

时间复杂度: O ( n 2 ) O(n²) O(n2)
空间复杂度: O ( n ) O(n) O(n)

102 Maximum Product Subarray 最大乘积子数组

给定一个整数数组 nums,找到数组中乘积最大的子数组并返回它。
子数组是数组中连续的非空元素序列。
您可以假设输出将适合 32 位整数。

示例1:
Input: nums = [1,2,-3,4]
Output: 4

示例2:
Input: nums = [-2,-1]
Output: 2

解题1:

class Solution:
    def countSubstrings(self, s: str) -> int:
        res = 0

        for i in range(len(s)):
            res += self.countPali(s, i, i)
            res += self.countPali(s, i, i + 1)
        return res
    
    def countPali(self, s, l, r):
        res = 0
        while l >= 0 and r < len(s) and s[l] == s[r]:
            res += 1
            l -= 1
            r += 1
        return res

时间复杂度: O ( n 2 ) O(n²) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

103 Partition Equal Subset Sum 分区等于子集和

您将获得一个正整数 nums 数组。
如果可以将数组划分为两个子集,即 subset1 和 subset2,其中 sum(subset1) == sum(subset2),则返回 true。否则,返回 false。

示例1:
Input: nums = [1,2,3,4]
Output: true
说明:数组可以分区为 [1, 4] 和 [2, 3]。

示例2:
Input: nums = [1,2,3,4,5]
Output: false

解题1:
要把元素分成和相等的两部分,那就先把所有元素相加再除以2,就知道每个部分是多少。下面是决策树。
在这里插入图片描述
在这里插入图片描述
我们每在决策树中使用一个元素,就把该元素从数组中去除,使用余下的子数组。同时,左右子树的target表示我们还需呀多少,每次更新一层,我们就会更新i和target。
在这里插入图片描述
我们使用自下而上的动态规划,在set中列出所有可能的和的情况。首先最后一个5和默认0开始,往前面一个位置遍历,0+11=11,5+11=16,添加到set中,此时set={0,5,11,16}。接下来是5,再把我和刚才的set中每个位置元素相加,依次类推,得到最终的set集合。

class Solution:
    def countSubstrings(self, s: str) -> int:
        res = 0

        for i in range(len(s)):
            res += self.countPali(s, i, i)
            res += self.countPali(s, i, i + 1)
        return res
    
    def countPali(self, s, l, r):
        res = 0
        while l >= 0 and r < len(s) and s[l] == s[r]:
            res += 1
            l -= 1
            r += 1
        return res

时间复杂度: O ( n 2 ) O(n²) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

104 Unique Paths 唯一路径

有一个 m x n 网格,您可以在任何时间点向下或向右移动。
给定两个整数 m 和 n,返回从网格左上角 (grid[0][0]) 到右下角 (grid[m - 1][n - 1]) 可以采用的可能的唯一路径的数量。
您可以假设输出将适合 32 位整数。

示例1:
Input: m = 3, n = 6
Output: 21

在这里插入图片描述

示例2:
Input: m = 3, n = 7
Output: 28

解题1: 动态规划(空间优化)
在这里插入图片描述
我们从终点开始往回走。因为我们只有向下和向右两条路径,所以每个位置可能的路径数就是下面和右面已知路径的总和。

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        # 这里先设置最后一行都为1
        row = [1] * n
        
        # 从下往上计算每行
        for i in range(m - 1):
            # 每行都先置为1
            newRow = [1] * n
            # 因为最右侧的一列只可以往下走,所以路径只有一个
            # 需要从倒数第二轮开始遍历
            for j in range(n - 2, -1, -1):
                newRow[j] = newRow[j + 1] + row[j]
            row = newRow
        return row[0]

时间复杂度: O ( m ∗ n ) O(m∗n) O(mn)
空间复杂度: O ( n ) O(n) O(n)

105 Longest Common Subsequence 最长公共 Subsequence

给定两个字符串 text1 和 text2,如果存在一个字符串,则返回两个字符串之间最长的公共子序列的长度,否则返回 0。
子序列是一个序列,它可以通过删除一些元素或不删除元素而不更改其余字符的相对顺序来从给定序列派生。
例如,“cat” 是 “crabt” 的子序列。
两个字符串的公共子序列是存在于两个字符串中的子序列。

示例1:
Input: text1 = "cat", text2 = "crabt" 
Output: 3 
解释: 最长的公共子序列是 “cat”,长度为 3。

示例2:
Input: text1 = "abcd", text2 = "abcd"
Output: 4

示例3:
Input: text1 = "abcd", text2 = "efgh"
Output: 0

解题1: 自下而上(动态规划)
在这里插入图片描述
这里是一个二维的矩阵,刚开始都初始化为0。我们从右下往左上进行遍历。当匹配到一个字符的时候就把右下位置+1的值赋值到该位置。

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        # 初始化二维矩阵
        dp = [[0 for j in range(len(text2) + 1)] for i in range(len(text1) + 1)]

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

时间复杂度: O ( m ∗ n ) O(m*n) O(mn)
空间复杂度: O ( m ∗ n ) O(m*n) O(mn)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Google Chrome-便携增强版[解压即用]

Google Chrome-便携增强版 链接&#xff1a;https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装&#xff0c;即可以覆盖更新又能解压使用&#xff01; √ 此增强版&#xff0c;支持右键解压使用 √ 加入Chrome增强…

[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型

Paper Card 论文标题&#xff1a;RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者&#xff1a;Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接&#xff1a;https://arxiv.org/ab…

[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型

Paper Card 论文标题&#xff1a;Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者&#xff1a;Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析&#xff0c;目前还处于陆续不断更新地更新过程中&#xff0c;为大佬的专业和开源贡献精神点赞。先收藏链接&#xff0c;后续慢慢学习。 相关链接如下&#xff1a; DIFY源码解析

hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题

Hexo 部署博客到 GitHub page 后&#xff0c;可以在 setting 中的 page 中绑定自己的域名&#xff0c;但是我发现更新博客后绑定的域名消失&#xff0c;恢复原始的 githubio 的域名。 后面搜索发现需要在 repo 里面添加 CNAME 文件&#xff0c;内容为 page 里面绑定的域名&…

【Block总结】MAB,多尺度注意力块|即插即用

文章目录 一、论文信息二、创新点三、方法MAB模块解读1、MAB模块概述2、MAB模块组成3、MAB模块的优势 四、效果五、实验结果六、总结代码 一、论文信息 标题: Multi-scale Attention Network for Single Image Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguan…

移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响

一、碎片化时间利用增加 随着生活节奏的加快&#xff0c;移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙&#xff0c;用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求&#xff0c;无需下载安装&#xff0c;随时可用&…

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…

攻防世界_simple_php

同类型题&#xff08;更难版->&#xff09;攻防世界_Web(easyphp)&#xff08;php代码审计/json格式/php弱类型匹配&#xff09; php代码审计 show_source(__FILE__)&#xff1a;show_source() 函数用于显示指定文件的源代码&#xff0c;并进行语法高亮显示。__FILE__ 是魔…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法&#xff08;了解&#xff09;2.2全域散列法&#xff08;了解&#xff09; 3.处理哈希冲突3.1线性探测&#xff08;挨着找&#xff09;3.2二次探测&#xff08;跳…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现&#xff08;轻量级实现&#xff09;。 分布式网关的特点&#xff08;相对于本地网关&#xff09;&#xff1a; 提供服务路由能力提供各种拦截支持 1、分布式网关推荐 建议使用专业的分布式网关产品&#xff0…

dmfldr实战

dmfldr实战 本文使用达梦的快速装载工具&#xff0c;对测试表进行数据导入导出。 新建测试表 create table “BENCHMARK”.“TEST_FLDR” ( “uid” INTEGER identity(1, 1) not null , “name” VARCHAR(24), “begin_date” TIMESTAMP(0), “amount” DECIMAL(6, 2), prim…

Spring AOP 入门教程:基础概念与实现

目录 第一章&#xff1a;AOP概念的引入 第二章&#xff1a;AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章&#xff1a;Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…

Upscayl-官方开源免费图像AI增强软件

upscayl 链接&#xff1a;https://pan.xunlei.com/s/VOI0Szqe0fCwSSUSS8zRqKf7A1?pwdhefi#

SpringBoot Web开发(SpringMVC)

SpringBoot Web开发&#xff08;SpringMVC) MVC 核心组件和调用流程 Spring MVC与许多其他Web框架一样&#xff0c;是围绕前端控制器模式设计的&#xff0c;其中中央 Servlet DispatcherServlet 做整体请求处理调度&#xff01; . 除了DispatcherServletSpringMVC还会提供其他…

苍穹外卖第一天

角色分工 技术选型 pojo子模块 nginx反向代理 MD5密码加密

C# Winform enter键怎么去关联button

1.关联按钮上的Key事件按钮上的keypress&#xff0c;keydown&#xff0c;keyup事件随便一个即可private void textBox1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode Keys.Enter){this.textBox2.Focus();}}2.窗体上的事件private void textBox2_KeyPress(object sen…

LeGO LOAM坐标系问题的自我思考

LeGO LOAM坐标系问题的自我思考 IMU坐标系LeGO LOAM代码分析代码 对于IMU输出测量值的integration积分过程欧拉角的旋转矩阵VeloToStartIMU()函数TransformToStartIMU(PointType *p) IMU坐标系 在LeGO LOAM中IMU坐标系的形式采用前(x)-左(y)-上(z)的形式&#xff0c;IMU坐标系…

vim交换文件的作用

1.数据恢复&#xff1a;因为vim异常的退出&#xff0c;使用交换文件可以恢复之前的修改内容。 2.防止多人同时编辑&#xff1a;vim检测到交换文件的存在,会给出提示&#xff0c;以避免一个文件同时被多人编辑。 &#xff08;vim交换文件的工作原理&#xff1a;vim交换文件的工作…

PHP实现混合加密方式,提高加密的安全性(代码解密)

代码1&#xff1a; <?php // 需要加密的内容 $plaintext 授权服务器拒绝连接;// 1. AES加密部分 $aesKey openssl_random_pseudo_bytes(32); // 生成256位AES密钥 $iv openssl_random_pseudo_bytes(16); // 生成128位IV// AES加密&#xff08;CBC模式&#xff09…