Leetcode刷题-不定长滑动窗口

分享丨【题单】滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环) - 力扣(LeetCode)

3090

class Solution:
    def maximumLengthSubstring(self, s: str) -> int:
        c = Counter()
        res = 0
        rk = -1
        for i in range(len(s)):
            if i != 0:
                # 左指针向右移动一格,移除一个字符
                c[s[i - 1]] -= 1
            while rk + 1 < len(s) and c[s[rk + 1]] < 2 :
                # 不断地移动右指针
                c[s[rk + 1]] += 1
                rk += 1
            res = max(res, rk - i + 1)
        return res
            
        

1493

思路:使用一个变长的滑动窗口进行扫描,当窗口中元素的状态符合题目要求时,窗口继续扩大,答案即为最大的窗口值减去删去的元素的数目。

class Solution:
    def longestSubarray(self, nums: List[int]) -> int:
        d = 0 #删除的元素的数目
        left = 0 #窗口的左端
        res = 0 #窗口的右端
        #从最左端开始,将每个元素添加到窗口中
        for i in range(len(nums)):
            #如果该元素为0,则删除
            if nums[i] == 0:
                d += 1
            #移动左端点直到删除元素的数目小于2为止
            while left < len(nums) and d == 2:
                if nums[left] == 0:
                    d -= 1
                left += 1
            #记录最大的窗口值
            res = max(res, i - left + 1 - d)
        #如果最大窗口值和数组长度相同,说明数组中没有0元素,又因必须删除一个元素,所以返回res-1
        if res == len(nums):
            return res - 1
        return res

1208

思路:使用变长滑动窗口,与1493差别不大。

class Solution:
    def equalSubstring(self, s: str, t: str, maxCost: int) -> int:
        changeCost = 0
        left = 0
        res = 0
        for i in range(len(s)):
            changeCost += math.fabs(ord(s[i]) - ord(t[i]))
            
            while changeCost > maxCost and left < len(s):
                changeCost -= math.fabs(ord(s[left]) - ord(t[left]))
                left += 1
            
            res = max(res, i - left + 1)
        return res
        

2730

思路:与1493、1208相似,变长滑动窗口的不同运用。

class Solution:
    def longestSemiRepetitiveSubstring(self, s: str) -> int:
        res = 0
        left = 0
        p = 0
        if len(s) == 1:
            return 1
        for i in range(1,len(s)):
            if s[i] == s[i - 1]:
                p += 1
            while p > 1 and left < len(s) - 1:
                if s[left] == s[left + 1]:
                    p -= 1
                left += 1
            res = max(res, i - left + 1)
        return res

904

思路:使用一个哈希表存储每次摘的水果,当采摘的水果种类大于2时,窗口的左端点向右一直移动,知道采摘的水果种类不超过2为止,然后记录每次移动左端或者右端后窗口的值,最大值即为答案。

class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        s = Counter()
        left = 0
        res = 0
        for i in range(len(fruits)):
            s[fruits[i]] += 1

            while len(s) > 2:
                #去掉最左端这个水果
                s[fruits[left]] -= 1

                #如果这个种类的水果数量为0了,就从篮子里删掉这一个种类
                if s[fruits[left]] == 0:
                    del s[fruits[left]]
                left += 1
            
            res = max(res, i - left + 1)
            
        return res

1695

class Solution:
    def maximumUniqueSubarray(self, nums: List[int]) -> int:
        res = 0
        now = 0
        left = 0
        c = Counter()
        for i in range(len(nums)):
            c[nums[i]] += 1
            now += nums[i]

            while c[nums[i]] > 1 and left < i:
                c[nums[left]] -= 1
                now -= nums[left]
                left += 1
            
            res = max(res, now)
        
        return res

2958

class Solution:
    def maxSubarrayLength(self, nums: List[int], k: int) -> int:
        res = 0
        left = 0
        c = Counter()
        for i in range(len(nums)):
            c[nums[i]] += 1

            while c[nums[i]] > k and left < i:
                c[nums[left]] -= 1
                left += 1
            
            res = max(res, i - left + 1)
        
        return res
        

2779

class Solution:
    def maximumBeauty(self, nums: List[int], k: int) -> int:
        nums.sort()
        res = 0
        left = 0
        for i in range(len(nums)):
            while nums[i] - nums[left] > 2*k:
                left += 1
            res = max(res, i - left + 1)
        return res
        

2024

class Solution:
    def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
        c = Counter()
        left = 0
        res = 0
        for i in range(len(answerKey)):
            c[answerKey[i]] += 1

            while min(c["T"], c["F"]) > k:
                c[answerKey[left]] -= 1
                left += 1

            res = max(res, i - left + 1)

        return res 
        

1004

class Solution:
    def longestOnes(self, nums: List[int], k: int) -> int:
        res = 0
        left = 0
        z = 0
        for i in range(len(nums)):
            if nums[i] == 0:
                z += 1
            while z > k:
                if nums[left] == 0:
                    z -= 1
                left += 1
            res = max(res, i - left + 1)
        return res

1658

class Solution:
    def minOperations(self, nums: List[int], x: int) -> int:
        
        left = 0
        res = -1
        s = sum(nums) - x
        for i in range(len(nums)):
            s -= nums[i]

            while s < 0 and left <= i:
                s += nums[left]
                left += 1
            
            if s == 0:
                res = max(res, i - left + 1)
        
        if res >= 0:
            return len(nums) - res
        else:
            return -1
        

1838

思路:使用变长滑动窗口,先对数组进行排序,每次加入元素时将所有在窗口内的元素递增到最大那个数(也就是当前加入的数),由于前面有i - left个元素已经递增到第 i 个数,所以此时需要递增(nums[i] - nums[i - 1]) * (i - left)次,当递增次数大于k时,持续移动左端点直到小于k为止。

class Solution:
    def maxFrequency(self, nums: List[int], k: int) -> int:
        if len(nums) == 1:
            return 1
            
        nums.sort()
        left = 0
        res = 0
        now = 0

        for i in range(1,len(nums)):
            now += (nums[i] - nums[i - 1]) * (i - left)

            while now > k:
                now -= (nums[i] -nums[left])
                left += 1
            
            res = max(res, i - left + 1)
        
        return res
        

2516

class Solution:
    def takeCharacters(self, s: str, k: int) -> int:
        c = Counter()
        n = len(s)
        for i in range(len(s)):
            c[s[i]] += 1
        print(c)
        if c['a'] < k or c['b'] < k or c['c'] < k:
            return -1
        res = 0
        left = -1
        for i in range(len(s)):
            c[s[i]] -= 1
            while c[s[i]] < k:
                left += 1
                c[s[left]] += 1
            res = max(res, i - left + 1)

        return n - res + 1

2831

class Solution:
    def longestEqualSubarray(self, nums: List[int], k: int) -> int:
        pos_lists = defaultdict(list)
        for i, x in enumerate(nums):
            pos_lists[x].append(i - len(pos_lists[x]))

        ans = 0
        for pos in pos_lists.values():
            if len(pos) <= ans:
                continue  # 无法让 ans 变得更大
            left = 0
            for right, p in enumerate(pos):
                while p - pos[left] > k:  # 要删除的数太多了
                    left += 1
                ans = max(ans, right - left + 1)
        return ans

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

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

相关文章

双层Git管理项目,github托管显示正常

双层Git管理项目&#xff0c;github托管显示正常 背景 在写React项目时&#xff0c;使用Next.js,该项目默认由git托管。但是我有在项目代码外层记笔记的习惯&#xff0c;我就在外层使用了git托管。 目录如下 code 层内也有.git 文件&#xff0c;对其托管。 我没太在意&…

54.数字翻译成字符串的可能性|Marscode AI刷题

1.题目 问题描述 小M获得了一个任务&#xff0c;需要将数字翻译成字符串。翻译规则是&#xff1a;0对应"a"&#xff0c;1对应"b"&#xff0c;依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的…

基于Langchain-Chatchat + ChatGLM 本地部署知识库

一、相关环境 参考链接: Github:https://github.com/chatchat-space/Langchain-Chatchat Langchain-chatchat版本&#xff1a;v0.3.1 安装环境&#xff1a;Ubuntu&#xff1a;22.04&#xff0c;CUDA&#xff1a;12.1 二、搭建过程 2.1 环境配置 2.1.1 创建chatchat虚拟环…

Hive:日志,hql运行方式,Array,行列转换

日志 可以在终端通过 find / | grep hive-log4j2 命令查找Hive的日志配置文件 这些文件用于配置Hive的日志系统。它们不属于系统日志也不属于Job日志&#xff0c;而是用于配置Hive如何记录系统日志和Job日志, 可以通过hive-log4j2 查找日志的位置 HQL的3种运行方式 第1种就是l…

护眼好帮手:Windows显示器调节工具

在长时间使用电脑的过程中&#xff0c;显示器的亮度和色温对眼睛的舒适度有着重要影响。传统的显示器调节方式不仅操作繁琐&#xff0c;而且在低亮度下容易导致色彩失真。因此&#xff0c;今天我想为大家介绍一款适用于Windows系统的护眼工具&#xff0c;它可以帮助你轻松调节显…

简要介绍C语言和c++的共有变量,以及c++特有的变量

在C语言和C中&#xff0c;变量是用来存储数据的内存位置&#xff0c;它们的使用方式和特性在两种语言中既有相似之处&#xff0c;也有不同之处。以下分别介绍C语言和C的共有变量以及C特有的变量。 C语言和C的共有变量 C语言和C都支持以下类型的变量&#xff0c;它们在语法和基…

Python爬虫学习第三弹 —— Xpath 页面解析 实现无广百·度

早上好啊&#xff0c;大佬们。上回使用 Beautiful Soup 进行页面解析的内容是不是已经理解得十分透彻了~ 这回我们再来尝试使用另外一种页面解析&#xff0c;来重构上一期里写的那些代码。 讲完Xpath之后&#xff0c;小白兔会带大家解决上期里百度搜索的代码编写&#xff0c;保…

消息队列篇--通信协议篇--应用层协议和传输层协议理解

在网络通信中&#xff0c;传输层协议和应用层协议是OSI模型中的两个不同层次的协议&#xff0c;它们各自承担着不同的职责。 下文中&#xff0c;我们以TCP/UDP&#xff08;传输层协议&#xff09;和HTTP/SMTP&#xff08;应用层协议&#xff09;为例进行详细解释。 1、传输层协…

Maui学习笔记- SQLite简单使用案例02添加详情页

我们继续上一个案例&#xff0c;实现一个可以修改当前用户信息功能。 当用户点击某个信息时&#xff0c;跳转到信息详情页&#xff0c;然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…

arkui-x跨平台与android java联合开发

华为鸿蒙系统采用的是arkts&#xff0c;支持跨平台crossplatform 即前端为arkts&#xff0c;arkui-x框架&#xff0c;后端为其他的语言框架。 本篇示例后端采用的是java&#xff0c;android studio工程。 主要方式是前端鸿蒙完成界面元素、布局等效果&#xff0c;后面androi…

Unity敌人逻辑笔记

写ai逻辑基本上都需要状态机。因为懒得手搓状态机&#xff0c;所以选择直接用动画状态机当逻辑状态机用。 架构设计 因为敌人的根节点已经有一个animator控制动画&#xff0c;只能增加一个子节点AI&#xff0c;给它加一个animator指向逻辑“动画”状态机。还有一个脚本&#…

ts 基础核心

吴悠讲编程 : 20分钟学会TypeScript 无废话速成TS https://www.bilibili.com/video/BV1gX4y177Kf

BGP分解实验·11——路由聚合与条件性通告(3)

续接上&#xff08;2&#xff09;的实验。其拓扑如下&#xff1a; 路由聚合的负向也就是拆分&#xff0c;在有双出口的情况下&#xff0c;在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由&#xff0c;在产生该聚合路由的范围内的条目注入到本地BGP表后再向…

【leetcode】T1599

解题心得&#xff1a; 题目长且绕&#xff0c;直接看测试样例的解析有助于更快把握题目核心需求&#xff08;即关注样例的输入、运算逻辑、输出&#xff09; 题面 原题链接1599. 经营摩天轮的最大利润 - 力扣&#xff08;LeetCode&#xff09; AC代码 class Solution { pub…

Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)

文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件&#xff08;金甲模板&#xff09;5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中&#xff0c;使用角色&#xff08;Role&#xff09;来远程部…

关于opencv环境搭建问题:由于找不到opencv_worldXXX.dll,无法执行代码,重新安装程序可能会解决此问题

方法一&#xff1a;利用复制黏贴方法 打开opencv文件夹目录找到\opencv\build\x64\vc15\bin 复制该目录下所有文件&#xff0c;找到C:\Windows\System32文件夹&#xff08;注意一定是C盘&#xff09;黏贴至该文件夹重新打开VS。 方法二&#xff1a;直接配置环境 打开opencv文…

Linux(19)——使用正则表达式匹配文本

新年快乐&#xff01; 目录 一、正则表达式&#xff1a; 二、通过 grep 匹配正则表达式&#xff1a; 三、查找匹配项&#xff1a; 一、正则表达式&#xff1a; 正则表达式使用模式匹配机制查找特定内容&#xff0c;vim、grep 和 less 命令都可以使用正则表达式&#xff0c;P…

蓝牙技术在物联网中的应用有哪些

蓝牙技术凭借低功耗、低成本和易于部署的特性&#xff0c;在物联网领域广泛应用&#xff0c;推动了智能家居、工业、医疗、农业等多领域发展。 智能家居&#xff1a;在智能家居系统里&#xff0c;蓝牙技术连接各类设备&#xff0c;像智能门锁、智能灯泡、智能插座、智能窗帘等。…

使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent

作者&#xff1a;来自 Elastic Nima Rezainia Confluent Cloud 用户现在可以使用更新后的 Elasticsearch Sink Connector 与 Elastic Agent 和 Elastic Integrations 来实现完全托管且高度可扩展的数据提取架构。 Elastic 和 Confluent 是关键的技术合作伙伴&#xff0c;我们很…

【数据结构】初识链表

顺序表的优缺点 缺点&#xff1a; 中间/头部的插入删除&#xff0c;时间复杂度效率较低&#xff0c;为O(N) 空间不够的时候需要扩容。 如果是异地扩容&#xff0c;增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间&#xff0c;会有不小的消耗。 扩容可能会存在…