HOT 100 | 【子串】76.最小覆盖子串、【普通数组】53.最大子数组和、【普通数组】56.合并区间

LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵 一、子串 二、普通数组 三、矩阵 阅读详情

一、【子串】76.最小覆盖子串

1. 解题思路

        定义两个哈希表分别用于 t 统计字符串 t 的字符个数,另一个sub_s用于统计字符串 t 在 s 的子串里面字符出现的频率。

        为了降低时间复杂度,定义一个变量t_count用于统计 t 哈希表中元素的个数。哈希表sub_s是一边遍历字符串s一边构建的,所以定义一个变量have用于统计有几个元素满足了t哈希表的条件。当且仅当t_count == have,则表明子串sub_s是涵盖t中所有字符。

        暴力枚举所有s的子串,然后在满足条件的子串中选出长度最小的返回即可,但是这种方法时间复杂度为O(n^2),我们可以选择时间复杂度更优的滑动窗口来解决(时间复杂度O(n))。

        (1)从s开始进行遍历,如果该字符在t中存在,那么更新sub_s和have后,若没有满足条件t_count == have,那么则移动滑动窗口的右边界;如果该字符在t中不存在,那么窗口右边界直接继续向右移动。

        (2)直到满足条件t_count == have,则记录当前窗口的长度length和起点start,然后将窗口的左边界向右移动后,更新sub_s和have。

        (3)如果sub_s和have不满足t_count == have,则重复步骤(1)。

        (4)如果再次遇到满足条件的子串,则判断其长度是否小于length,如果是则更新length和start。

2. 代码实现

class Solution:
    def minWindow(self, s:str, t:str)->str:
        ans_left = -1
        ans_right = len(s)
        cnt_s = Counter()
        cnt_t = Counter(t)
        
        left = 0
        for right, c in enumerate(s):
            cnt_s[c] += 1
            while cnt_s >= cnt_t:
                if right-left < ans_right-ans_left:
                    ans_left, ans_right = left, right 
                cnt_s[s[left]] -= 1
                left += 1
        return "" if ans_left < 0 else s[ans_left:ans_right+1]
                    

二、【普通数组】53.最大子数组和

1. 解题思路

        本题采用动态规划五部曲进行解答。

        (1)定义dp数组:dp[i]表示的是以nums[i]结尾的最大连续子序列的和。

        (2)递推公式:可以发现,连续子序列的和dp[i]分为两种状态可以得到,一是dp[i-1]+nums[i],也就是延续前面的子序列;另一种是nums[i],也就是从该元素开始的子序列。因此,得到递推公式:dp = max(dp[i-1]+nums[i], nums[i] )

        (3)初始化:dp[0]必须初始化为数组的头元素,即dp[0] = nums[0],其余的元素可以初始化任意值,因为随着状态转移其真正的值会覆盖初始值。

        (4)遍历顺序:正常的遍历顺序即可。

        (5)打印:注意最后输出的不是dp[i],因为最大子数组和不一定是最后一个元素结尾的。

2. 代码实现

class Solution:
    def maxSubArray(self, nums: List[int])->int:
        dp = [0] * len(nums)
        dp[0] = nums[0]
        for i in range(1, len(nums)):
            dp[i] = max(dp[i-1]+nums[i], nums[i])
        return max(dp)

三、【普通数组】56.合并区间

1. 解题思路

        本题采用贪心算法。

        (1)为了方便对区间进行合并,需要对区间按照左边界或者右边界进行排序。

        (2)判断区间是否发生重叠:当前区间的左边界是否小于等于上一个区间的右边界,如果是则说明这两个区间发生了重叠,那么需要合并区间;如果不是则说明没有发生重叠,那么定义一个新数组存放将当前区间。

        (3)注意:在合并区间的过程中,是更新区间的右边界,但最新的右边界并不一定是当前区间的右边界,因为可能存在上一个区间右边界大于当前区间右边界的情况,所以在进行合并的时候,更新右边界应该是取当前区间右边界和上一个区间右边界的最大值。

2. 代码实现

class Solution:
    def merge(self, intervals:List[List[int]])->List[List[int]]:

        # 定义一个变量result用于存放结果集
        result = []

        # 判断给出的intervals是否为空
        if len(intervals) == 0:
            return result

        # 按照左边界对区间进行排序
        intervals.sort(key = lambda x: x[0])
        
        # 将第一个区间加入到结果集中,再进行更新即可
        result.append(intervals[0])

        # 遍历区间,从1开始是因为为了防止i-1异常
        for i in range(1, len(intervals)):
            # 判断区间是否重叠
            if result[-1][1]>=intervals[i][0]:
                result[-1][1] = max(result[-1][1], intervals[i][1])
            else:
                result.append(intervals[i])
        return result

LeetCode HOT-100 分类总结 阅读详情

相关推荐

针对so层不固定位置的动态加密,怎么解决?(面试题)

Android逆向之破解某应用加密算法(动态调试so和hook so代码):so 代码动态解密后才执行,我们可以在解密完成后获取解密后的代码或数据。Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)如果你有更具体的加密场景,欢迎提供更多信息,我可以给出更详细的方案!某些 so 在运行时生成密钥,解密后再用。某APP密码加密算法分析。

SXXYNHHXX的博客 925

LeetCode 打卡 Day 40 —— 最小覆盖子串

1、题目 2、题解 困难级别的问题,不出意外把我困难住了😭,纠结了半天能否用动态规划进行解决,没想到动态规划的具体解决办法,所以还是直接去看题解了。题解使用了滑动窗口,印象中这是第一次看到滑动窗口算法,之前只在计算机网络中接触过,算法库中新增一员😊。具体的算法内容如下: ...

weixin_41804479的博客 314

MATLAB信号处理实战:VMD分解参数调优全指南(附避坑技巧)

本文深入探讨了MATLAB中变分模态分解(VMD)的核心参数调优实战技巧。针对模态数K和惩罚系数α的选择难题,提供了从经验估计、可视化观察到量化指标辅助的渐进式调优框架,并分享了避免过分解与欠分解的实用避坑指南,旨在帮助工程师高效处理非平稳信号,提取清晰的物理特征。

weixin_29079671的博客 144

1. 76 最小覆盖子串(hard)

题目:76 最小覆盖子串(hard)一、题目二、 思路二、自己写的1.代码三、标准答案1.滑动窗口2.总结 一、题目 Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If there is no s

qq_55841250的博客 800

Ubuntu 22.04 安装 PostgreSQL + AGE + pgvector 完全指南

本教程详细介绍了在Ubuntu 22.04服务器上安装PostgreSQL数据库,并为其添加AGE图数据库扩展和pgvector向量搜索扩展的步骤。首先,更新系统并安装PostgreSQL,然后通过源码构建并安装AGE和pgvector扩展。接着,配置PostgreSQL以使用这些扩展,并可选地允许远程连接。教程还包括创建用户、设置密码、验证安装以及安装后的优化建议。最后,提供了常见问题的解决方法。通过本教程,用户可以在同一数据库中处理关系型数据、图数据和向量数据,为现代应用程序提供强大的数据支持。

这个是个人博客,记录生活中的一些日常。 1742

YOLOv11+SAHI实战:5步搞定无人机航拍小目标检测(附VisDrone数据集调参技巧)

本文详细介绍了如何结合YOLOv11目标检测框架与SAHI切片推理技术,高效解决无人机航拍图像中的小目标检测难题。通过VisDrone数据集调参技巧和5步实战指南,帮助开发者快速构建高性能检测系统,显著提升小目标检测的准确率和效率。

rum55的博客 190

LeetCode-最小覆盖子串(76)

最小覆盖子串 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 题目地址:https://leetcode-cn.com/probl...

江冷易水寒 6904

通义千问对接FreeSWITCH实现大模型呼叫中心

通义千问是由阿里云开发的大规模语言模型,具备优秀的自然语言处理能力,支持文本生成、问答对话、摘要提取等多种任务。它不仅拥有丰富的知识储备,还能根据上下文灵活调整回答策略,适用于各种复杂场景下的自动化交流。FreeSWITCH是一个开源的多媒体通信服务器,提供了包括VoIP通话、即时消息传递在内的多种通信服务。它的模块化设计允许开发者根据实际需求定制功能,广泛应用于企业级通信系统中。通过集成通义千问,FreeSWITCH能够实现更智能的客户服务体验。

技术永不眠 Q:53195017 1498

1420 · 最小覆盖子串II

描述 给你一个字符串 S、一个字符串 T,S是循环的,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 样例 示例1: 输入: S = "abcdc" T = “da” 输出: "dca" 解释:你可以将S旋转成 "bcdca",因此你的最小覆盖子串就是“dca” 示例2: 输入: S = "ADOBECODEBANC" T = "DAOC" 输出: "CAD

yinhua405的博客 3817

《Python入门到精通》函数详解

函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。 2、函数的参数 2.1、变量的就近原则 2.2、传递参数 2.3、形参和实参 2.4、位置参数 2.5、缺省参数 2.6、可变类型和不可变类型 2.7、关键字参数 3、匿名函数 4、函数的返回值

wangyuxiang946的博客 1万+

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

【深度学习|Transformer模型学习】什么是前馈神经网络(Feed-Forward Neural Network)?将前馈神经网络中的全连接层变成1*1卷积层会有什么样的效果?

985小水博的摸鱼日常 1376

KMP与最小覆盖子串

         我对KMP的一些理解(lyp点拨的):pre[i](或next[i])的实质是串str[1..i]的最长且小于i的“相等前、后缀”分别为str[1..pre[i]](前缀)与str[(i-pre[i]+1)..i](后缀),通俗讲就是:使str[1..i]前k个字母与后k个字母相等的最大k值。KMP算法详解可见:http://blog.csdn.net/fjsd155/artic...

FanJin的博客 5753

准备生日礼物

摘要: 题目要求统计某月份需要准备的员工生日礼物数量。输入包括目标月份、员工姓名列表和对应的生日列表(格式为Year/Month/Day)。需处理重复员工(以最后一次录入为准),统计该月生日的员工人数。示例1中5月有3名员工生日,输出3;示例2中10月有6名,输出6。解题关键在于使用哈希表去重(以员工姓名为键),拆分生日字符串提取月份进行匹配。代码实现(C++/Java/Python)均遵循以下步骤:读取输入、哈希去重、解析月份并统计目标月份人数。时间复杂度为O(n),空间复杂度O(n)。

面试高手的博客 298

【Java】HOT100 哈希到普通数组

​​​​​​​。

weixin_43562105的博客 2160

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

力扣爆刷第85天之hot100五连刷11-15

思路:求滑动窗口内的最大值,自然要维护一个滑动窗口,这里我们使用一个队列来表示滑动窗口,既然要记录最大值,那么我们在添加元素时,自然要如果队尾元素小于当前元素,队尾元素就应该出队,直到没有小于当前元素的存在,然后把当前元素入队,这样队头位置就是滑动窗口内的最大值。题目链接:https://leetcode.cn/problems/sliding-window-maximum/description/?

qq_43511039的博客 2123

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Leetcode HOT 100 题目总结(已完结)

文章目录前引题目博客链接Easy No.1 - No.21 前引 这段时间感觉动态规划已经做伤了 就是真的没什么动力再做下去了 后面没做的也都是难的不行的dp题目了 想着还是要做的 这段时间换点口味 把力扣HOT 100题给全做了 写个总结 题目博客链接 Easy No.1 - No.21 461. 汉明距离 617. 合并二叉树 104. 二叉树的最大深度 206. 反转链表 169. 多数元素 21. 合并两个有序链表 ...

Love 6's Private Blog 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode 热题 HOT100(三):子串进阶与普通数组(Go 实现)

(欢迎来访)✨本文覆盖力扣「热题 100」学习计划第题,全部使用实现。第 10 题「和为 K 的子数组」见上一篇;本篇从滑动窗口最大值开始。

lihaoweiwudi_的博客 551

【面试HOT100】子串&&普通数组&&矩阵

系列综述:💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。🥰来源:材料主要源于进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。🤭结语:如果有帮到你的地方,就和!!🌈。

qq_43840665的博客 772

Hot 100总结【leetcode】

leetcode hot100总结

weixin_44911248的博客 6640

LeetCode 热题 HOT 100 题解(仅记录解题思路)

由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。指针p1在头结点处,指针p2在头结点的next处,然后p1每次移动1格,p2则走2步,若在其中一个进入null之前两者指向同一结点,则代表有环。使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

a131529的博客 1万+

leetcode HOT100总结

本人菜鸡一枚,历时两个月时间把HOT100题做完(Ctrl C-V)了,做完之后还是感觉到很虚,很多中等题还是不会做,于是乎花几天时间把这100题给总结一下。一方面,对自己的知识梳理;另一方面,便于后续回顾。(完成度99,是因为有一道题目收费,没有做!哈哈哈!)以下所有题目都是用Python3实现的。 下面是对这些题目按照算法进行分类整体,主要包括排序、哈希表、递归\回溯、链表、双指针、动态规划、二分查找、贪心、树、深度优先搜索、广度优先搜索等。 在整理之前,先学习一下Python的基本数据类型有哪些,请

qq_36561737的博客 4746

力扣hot100

【代码】力扣hot100。

qq_59768361的博客 1401

LeetCode 热题 HOT 100 完整题解笔记&知识点分类 C++代码实现

1、知识点分布 2、完整代码

小哈里的博客 1万+

HOT 100(导航)【LeetCode】

HOT 100(导航)【LeetCode】

小心星的博客 858

代码随想录算法训练营第二天 | 209.长度最小的子数组、59.螺旋矩阵II、58. 区间和、44. 开发商购买土地

状态:√类别:滑动窗口难度:mid还可以,调试了两次ac了,基本思路没问题,边界条件要明确状态:×类别:转圈逻辑难度:mid做了n次了还是不记得,有基本思路,但是忘记了要定义四个变量状态:×类别:前缀和难度:mid昨天刚做过前缀和的题...思想要记牢,熟悉ACM模式,开始使用了Map超时了,可以用数组。

weixin_47495480的博客 1466

【力扣Hot 100+经典题型】刷题记录(Python版)

力扣hot 100刷题记录

我的技术栈碎碎念空间 7845
上一篇: 代码随想录 Day 45 | 【第九章 动态规划part 08】121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
下一篇: HOT 100 | 189.轮转数组、238. 除自身以外数组的乘积、41. 缺失的第一个正数
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值