首页 > 其他分享 >滑动窗口模型

滑动窗口模型

时间:2023-12-10 18:00:27浏览次数:24  
标签:cnt right 窗口 nums int res 模型 滑动 left

指针的本质是映射,使用一个地址保留我们想知道的东西。

滑动窗口是双指针思想的一种实现,使用l, r两个指针来维护一个数组的子序列。

滑动窗口问题可以分为两类,一类是固定大小的滑动窗口,一类是变长滑动窗口。

 

定长滑动窗口:求区间最大

不定长滑动窗口: 求最长,最短,子数组个数。

 

 

变长滑动窗口求最长最短问题

 

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n = len(nums)
        res = inf
        s = 0
        left = 0
        for right, x in enumerate(nums):
            s += x
            while s - nums[left] >= target:
                s -= nums[left]
                left += 1
            if s >= target:
                res = min(res, right - left + 1)
        
        return res if res <= n else 0

 

 

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        cnt = Counter()
        left = 0
        res = 0
        for right, x in enumerate(s):
            cnt[s[right]] += 1
            while cnt[s[right]] > 1:
                cnt[s[left]] -= 1
                left += 1
            res = max(res, right - left + 1)

        return res

 

 

 

class Solution:
    def longestSubarray(self, nums: List[int]) -> int:
        n = len(nums)
        res = 0
        left = 0
        cnt = 0
        for right, x in enumerate(nums):
            if x == 0:
                cnt += 1
            while cnt > 1:
                if nums[left] == 0:
                    cnt -= 1
                left += 1
            res = max(res, right - left)

        return res

 

 

class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        n = len(fruits)
        left = 0
        res = 0
        c = Counter()
        cnt = 0
        for right, x in enumerate(fruits):
            c[fruits[right]] += 1
            if c[fruits[right]] == 1:
                cnt += 1
            while cnt > 2:
                if c[fruits[left]] == 1:
                    cnt -= 1
                c[fruits[left]] -= 1
                left += 1
            res = max(res, right - left + 1)
        return res
            

 

 

不定长滑动窗口求连续子数组个数,滑动窗口结合集合视角和贡献法。

这种问题我们以集合的视角看待问题,当我们使用滑动窗口时,我们每次都在向右移动右指针。

当我们的[left, right]区间满足条件时,我们把左指针移动到刚刚不满足条件的位置,及我们把left-1, [left-1, left-2]...这个子串拼接上去后就可以合格,我们当前的区间对答案的贡献就是left, 然后res += left

第二种思路是找到合法的左端点最小值,然后分析当前区间对答案的贡献,进行累加即可。

 

class Solution:
    def countCompleteSubarrays(self, nums: List[int]) -> int:
        n = len(nums)
        cnt = Counter()
        m = len(set(nums))
        res = left = 0
        for v in nums:
            cnt[v] += 1
            while len(cnt) == m:
                x = nums[left]
                cnt[x] -= 1
                if cnt[x] == 0:
                    del cnt[x]
                left += 1
            res += left

        return res

 

 

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        n = len(nums)
        mx = max(nums)
        cnt = 0
        res = left = 0
        for v in nums:
            if v == mx:
                cnt += 1
            while cnt >= k:
                if nums[left] == mx:
                    cnt -= 1
                left += 1
            res += left
        
        return res

 

 

class Solution:
    def numberOfSubstrings(self, s: str) -> int:
        n = len(s)
        res = left = 0
        c = Counter()
        cnt = 0
        for v in s:
            c[v] += 1
            if c[v] == 1:
                cnt += 1
            while cnt == 3:
                c[s[left]] -= 1
                if c[s[left]] == 0:
                    cnt -= 1
                left += 1
                
            res += left
        
        return res

 

这就要那种第二个思路。

 

 

多指针滑动窗口

我们遇到的问题一般以双指针为主,需要三个及以上的指针的问题我们称之为多指针问题。

多指针滑动窗口一般的实现方法是,右端点right依旧正常每次加一,我们维护l1, l2两个指针,类似于lower_bound和upper_bound函数,每次res += l2 - l1

 

class Solution:
    def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
        n = len(nums)
        l1 = l2 = res = 0
        s1 = s2 = 0
        for right, x in enumerate(nums):
            s1 += nums[right]
            s2 += nums[right]
            while l1 <= right and s1 > goal:
                s1 -= nums[l1]
                l1 += 1
            while l2 <= right and s2 >= goal:
                s2 -= nums[l2]
                l2 += 1
            res += l2 - l1

        return res

 

 

class Solution:
    def numberOfSubarrays(self, nums: List[int], k: int) -> int:
        n = len(nums)
        l1 = l2 = res = 0
        s1 = s2 = 0
        for right, x in enumerate(nums):
            if x & 1 == 1:
                s1 += 1
                s2 += 1
            while l1 <= right and s1 > k:
                if nums[l1] & 1 == 1:
                    s1 -= 1
                l1 += 1
            while l2 <= right and s2 >= k:
                if nums[l2] & 1 == 1:
                    s2 -= 1
                l2 += 1
            res += l2 - l1

        return res

 

标签:cnt,right,窗口,nums,int,res,模型,滑动,left
From: https://www.cnblogs.com/zk6696/p/17892871.html

相关文章

  • pyqt6 登录窗口
    pyqt_login-master/main.pyimportsysfromPyQt6importQtGui,QtWidgetsfromPyQt6.QtWidgetsimportQMainWindow,QMessageBoxfromWindowsimportloginuser_icon="assets/favicon.ico"users={"user":"admin123"}class......
  • 农业领域的AI大模型有哪些?
    目录AgriGPT精准农业-GPTChatAgriPigGPT小田(一亩田)耕云农业大模型(安徽省农业厅+科大讯飞))商汤AI遥感大模型AI遥感大模型(AIE-SEG)小编碎碎念AI大模型火了整整一年,那么在农业领域,目前有哪些企业做了哪些产品出来了呢?小编简单调研了下,分享给大家。首先,哪些农业场景适用AI大模型?第一,......
  • Reactor模型
    目录1.Reactor模型是什么2.Reactor模型应用场景3.使用Reactor模型的软件4.Reactor模型与Actor模型的关系本文主要介绍Reactor模型基本概念以及应用场景。1.Reactor模型是什么Reactor模型是一种事件驱动的设计模式,用于处理服务请求,它是由一个或多个并发输入源同时发送给......
  • 使用双卡/8卡3090微调llama2-70B/13B模型
    写在前面本篇博文将会教大家如何在消费级的设备(或者各种超级便宜的洋垃圾上)实现13B/70B等无法在单张消费级显卡上加载(但可以在一台机器上的多张卡上加载)的模型的微调。由于绝大部分做实验,仅要求实现推理,或者在微调时没有资源上到全量/13B+级别的真·大模型的微调,没有涉及到将一......
  • 逻辑视图模型建模图片
                          ......
  • 实现视图模型建模
    实现视图模型建模 一实验目的l 理解顺序图、协作图、活动图、状态机图的概念及其在系统分析设计中的作用;l 了解和掌握软件工程中用例逻辑时序的分析方法;l 掌握两种交互图(顺序图和协作图)的差别;l 掌握描述一个操作执行过程中所完成工作(动作)的方法;l 掌握描述对象内部工......
  • 将驱动程序移植到新的驱动模型 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/porting.html将驱动程序移植到新的驱动模型PatrickMochel2003年1月7日概述请参阅Documentation/driver-api/driver-model/*.rst以获取各种驱动程序类型和概念的定义。将设备驱动程序移植到新模型的大部分......
  • 逻辑视图模型建模会员关系管理
    一实验目的l 理解面向对象系统分析和对象类建模的概念;l 了解和掌握面向对象系统分析的方法和步骤;l 了解和掌握寻找待开发系统中类的方法和技巧;l 了解和掌握分析类之间继承关系的方法;l 了解和掌握分析类之间的关联关系的方法;l 掌握使用RationalRose建立类图模型的方......
  • 驱动模型 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/index.htmlDriverModel(驱动程序模型)DriverBinding(驱动绑定)BusTypes(总线类型)DeviceDriverDesignPatterns(设备驱动程序设计模式)TheBasicDeviceStructure(基本设备结构)Devres-ManagedDeviceResou......
  • 为什么ESP-idf这个powershell窗口有时会打不开,有人遇到过这个问题吗
    ESP-IDF,全称EspressifIoTDevelopmentFramework,是乐鑫官方的物联网开发框架。它主要适用于ESP32、ESP32-S、ESP32-C和ESP32-H系列SoC的开发。此外,它还基于C/C++语言提供了一个自给自足的软件开发工具包(SDK),为用户在这些平台上开发通用应用程序提供了方便。同时,ESP-IDF支持多种网络......