滑动窗口问题

日升时奋斗,日落时自省 

目录

一、长度最小的子数组

二、无重复字符的最长子串

三、最大连续1的个数III

四、将x减到0的最小操作数

五、水果成篮

六、找到字符串中所有字母异位词

七、串联所有单词的⼦串

八、最小覆盖子串


注:滑动窗口其实很类似与快慢指针,主要步骤入窗口  进行判断 出窗口

一、长度最小的子数组

题目来源:. - 力扣(LeetCode)

子数组:是数组中连续几个数(集合)

题目主要内容找到子数组个数最少的和满足target

代码:

    public int minSubArrayLen(int target, int[] nums) {
        //0x3f3f3f3f 表示Integer最大值的一半
        int ret=0x3f3f3f3f, n=nums.length;
        int sum=0;
        for(int left = 0, right = 0;right<n;right++){
            //入窗口
            sum+=nums[right];
            //判定出窗口条件
            while(sum>=target){
                //求最小长度
                ret=Math.min(ret,right-left+1);
                //出窗口
                sum-=nums[left];
                left++;
            }
        }
        //如果值不变说明没有找到 就是 0 如果找到了用ret原值
        return ret==0x3f3f3f3f?0:ret;
    }

二、无重复字符的最长子串

题目来源:. - 力扣(LeetCode)

题目主要内容找所有子串中不重复的最长子串且不重复

代码:

    public int lengthOfLongestSubstring(String s) {
        //将字符串转化为数组
        char[] nums=s.toCharArray();
        int n=nums.length;
        //满足数字、符号、英文字母的ascll码
        char[] hash=new char[128];
        int left = 0, right = 0;
        int ret=0;
        while(right<n){
            //入窗口
            hash[nums[right]]++;
            //条件判断
            while(hash[nums[right]]>1){
                //出窗口
                hash[nums[left]]--;
                left++;
            }
            //计算条件
            ret=Math.max(ret,right-left+1);
            //每次都会进行入窗口的 所以结尾right++
            right++;
        }
        return ret;
    }

三、最大连续1的个数III

题目来源:. - 力扣(LeetCode)

题目主要内容就是 找到连续1最多的子数组,这里面可以把0变为1最多k次

代码:

    public int longestOnes(int[] nums, int k) {
        int ret = 0;
        for(int left = 0 , right = 0 , count = 0; right < nums.length ; right++){
            //记录 0 的个数 ,创造判定条件
            //入窗口
            if(nums[right]==0){
                count++;
            }
            //判定条件
            while(count>k){
                //直到 0 位置 个数--
                if(nums[left]==0){
                    count--;
                }
                left++;
            }
            //每次入窗口都会记录1的长度 并且 对比 取 最大值
            ret=Math.max(ret,right-left+1);
        }
        return ret;
    }

四、将x减到0的最小操作数

题目来源:. - 力扣(LeetCode)

题目主要内容 每次 减 最左边 或者 最右边的值 目标值恰好减到 0

其实正面看 考虑的条件是很多的,不止四个需要判断的条件 (正难则反)

反向分析:

代码:

    public int minOperations(int[] nums, int target) {
        int left = 0 , right = 0, ret = -1;
        int n=nums.length;
        int sum=0;
        //计算 总和
        for(int x : nums){
            sum+=x;
        }
        //求差值
        int diff=sum-target;
        //差值必须是存在的 如果都不存在了,直接返回结果
        if(diff<0){
            return -1;
        }
        //计算临时和
        int tmp=0;
        while(right<n){
            //入窗口
            tmp+=nums[right];
            //条件判断
            while(tmp>diff){
                tmp-=nums[left];
                left++;
            }
            //出窗口
            if(tmp==diff){
                ret=Math.max(ret,right-left+1);
            }
            right++;
        }
        //注意:这里求的是外面的最小个数 所以这里要那整个长度去减
        return ret==-1?-1:nums.length-ret;
    }

五、水果成篮

题目来源:. - 力扣(LeetCode)

题目主要内容 水果承篮 一共有两个篮子 一个篮子只能放一种水果 计算能连续装最多个水果(仅限两种)

代码:

    public int totalFruit(int[] fruits) {
        int left =0;
        int right =0;
        int ret =0,count=0,n=fruits.length;
        //计算种类
        int kind =0;
        //提供判断条件 计算当前水果种类的个数
        int[] hash=new int[n];
        while(right<n){
            //入窗口
            if(hash[fruits[right]]==0){
                kind++;
            }
            hash[fruits[right]]++;
            //条件判断
            while(kind>2){
                hash[fruits[left]]--;
                //出窗口
                if(hash[fruits[left]]==0){
                    kind--;
                }
                left++;
            }
            //每次入窗口都会进行一次计算
            count=Math.max(count,right-left+1);
            right++;
        }
        return count;
    }

六、找到字符串中所有字母异位词

题目来源:. - 力扣(LeetCode)

题目主要内容 就是在字符串找子串异位词  

异位词:abc 的异位词 就是  bca、acb就是本身不变,但是位置变了 

代码:

    public List<Integer> findAnagrams(String ss, String pp) {
        List<Integer> ret=new ArrayList<>();
        char[] s=ss.toCharArray();
        char[] p=pp.toCharArray();
        //存储子串 用于判断条件
        int[] hash2 = new int[26];
        for(char tmp:p){
            hash2[tmp-'a']++;
        }
        //作为判断条件推进
        int[] hash1=new int[26];
        int m=p.length;
        for(int left=0,right=0,count=0;right<s.length;right++){
            //s[right]-'a'就是想表示 字符串中的字符
            hash1[s[right]-'a']++;
            //入窗口
            if(hash1[s[right]-'a']<=hash2[s[right]-'a'])count++;
            //判定条件
            while(right-left+1>m){
                char out=s[left];
                //出窗口
                left++;
                //如果字符串中在这个滑动区间不够 凑成子串count--
                if(hash1[out-'a']--<=hash2[out-'a'])count--;
            }
            //count就是用来计算是否满足子串个数的
            if(count==m){
                ret.add(left);
            }
        }
        return ret;
    }

七、串联所有单词的⼦串

题目来源:. - 力扣(LeetCode)

题目主要内容 s字符串中的子串有words数组中的所有子串并记录下当前子串的初始位置

代码:

    public List<Integer> findSubstring(String s, String[] words) {
       List<Integer> ret=new ArrayList<>();
       Map<String,Integer> hash=new HashMap<>();
       //保存数组中单词的频次
       for(String str:words)hash.put(str,hash.getOrDefault(str,0)+1);
       int len =words[0].length(),m=words.length;
       //执行次数
       for(int i=0;i<len;i++){
           Map<String,Integer> hash2=new HashMap<>();
           //开始滑动 滑动单位就是 数组单个长度
           for(int left = i,right = i,count=0;right + len<=s.length();right+=len){
               //将字符串中按 数组单个长度 进行拆分
               String in=s.substring(right,right+len);
               //入窗口
               hash2.put(in,hash2.getOrDefault(in,0)+1);
               //判断是否是我们需要的 如果是那就进行加加
               if(hash2.get(in)<=hash.getOrDefault(in,0))count++;
               //判断条件 如果条件是大于说明 已经多了
               if(right-left+1>m*len){
                   //出窗口
                   String out=s.substring(left,left+len);
                   if(hash2.get(out)<=hash.getOrDefault(out,0))count--;
                   //left滑动后移
                   hash2.put(out,hash2.get(out)-1);
                   left+=len;
               }
               //每次入窗口都查看是否满足条件
               if(count==m)ret.add(left);
           }
       } 
       return ret;
    }

八、最小覆盖子串

题目来源:. - 力扣(LeetCode)

题目主要内容 在s字符串中找到最小子串且包含t子串中的所有字符

代码:

    public String minWindow(String ss, String tt) {
        char[] s=ss.toCharArray();
        char[] t=tt.toCharArray();
        //存放tt的所有字符串
        int[] hash1=new int[128];
        //表示字符串种类
        int kind=0;
        for(char ch : t)
        {
            //计算字符串种类
            if(hash1[ch]++==0){
                kind++;
            }
        }
        //统计临时子串
        int[] hash2=new int[128];
        //满足条件的最小长度
        int minlen=Integer.MAX_VALUE;
        //这里采用字符串截取 需要保留最小子串的初始位置
        int begin=-1;
        for(int left = 0,right = 0,count=0;right<s.length;right++){
            //入窗口
            char in= s[right];
            if(++hash2[in]==hash1[in])count++;
            //判断条件
            while(count==kind){
                //若果当前个数小于上一个最小值 在进行计算
                if(right-left+1<minlen){
                    //计算最小值
                    minlen=right-left+1;
                    //保存最小子串起始位置的下标
                    begin=left;
                }
                //出窗口
                char out=s[left++];
                if(hash2[out]--==hash1[out])count--;
            }
        }
        return begin==-1?new String():ss.substring(begin,begin+minlen);
    }

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

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

相关文章

图片按照宽度进行居中裁剪,缩放大小

要求 文件存放在img_folder_path中 裁剪要求&#xff1a; 图片大小以高度为基准。居中裁剪 缩放要求&#xff1a; 图片缩放到512大小 图片另存到save_file_path路径中 代码 import numpy as np import cv2 import os from tqdm import tqdm#原图片存放位置 img_folder_p…

操作系统原理与实验——实验三优先级进程调度

实验指南 运行环境&#xff1a; Dev c 算法思想&#xff1a; 本实验是模拟进程调度中的优先级算法&#xff0c;在先来先服务算法的基础上&#xff0c;只需对就绪队列到达时间进行一次排序。第一个到达的进程首先进入CPU&#xff0c;将其从就绪队列中出队后。若此后队首的进程的…

Spring重点记录

文章目录 1.Spring的组成2.Spring优点3.IOC理论推导4.IOC本质5.IOC实现&#xff1a;xml或者注解或者自动装配&#xff08;零配置&#xff09;。6.hellospring6.1beans.xml的结构为&#xff1a;6.2.Spring容器6.3对象的创建和控制反转 7.IOC创建对象方式7.1以有参构造的方式创建…

【硬件相关】RDMA网络类别及基础介绍

文章目录 一、前言1、RDMA网络协议2、TCP/IP网络协议 二、RDMA类别1、IB2、RoCE3、iWARP 三、RDMA对比1、优缺点说明a、性能b、扩展性c、维护难度 2、总结说明 一、前言 roce-vs-infiniband-vs-tcp-ip RoCE、IB和TCP等网络的基本知识及差异对比 分布式存储常见网络协议有TCP/IP…

【【C语言简单小题学习-1】】

实现九九乘法表 // 输出乘法口诀表 int main() {int i 0;int j 0;for (i 1; i < 9; i){for (j 1; j < i;j)printf("%d*%d%d ", i , j, i*j);printf("\n"); }return 0; }猜数字的游戏设计 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdi…

c语言--qsort函数(详解)

目录 一、定义二、用qsort函数排序整型数据三、用qsort排序结构数据四、qsort函数的模拟实现 一、定义 二、用qsort函数排序整型数据 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…

点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识 &#xff08;一&#xff09;PCD点云存储格式相较于其它存储格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的优势[1] &#xff08;1&#xff09;具有存储和处理有组织的点云数据集的能力&#xff0c;这对于实时应用和增强现实及机器…

GEE入门篇|图像处理(三):阈值处理、掩膜和重新映射图像

阈值处理、掩膜和重新映射图像 本章前一节讨论了如何使用波段运算来操作图像&#xff0c; 这些方法通过组合图像内的波段来创建新的连续值。 本期内容使用逻辑运算符对波段或索引值进行分类&#xff0c;以创建分类图像。 1.实现阈值 实现阈值使用数字&#xff08;阈值&#xf…

YOLOv9独家原创改进|增加SPD-Conv无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、文章摘要 卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而&#xff0c;当图像分辨率较低或物体较小时&…

电源通常向计算机内部的各种组件提供的三种电压:1

本文将与您分享电源通常为计算机内部各个组件提供的三种电压是什么。 小编觉得还是比较实用的&#xff0c;所以分享给大家&#xff0c;作为参考。 下面就跟随小编一起来看看吧。 电源通常为电脑内部的各个部件提供三种电压&#xff1a; 1&#xff0e; 5V&#xff0c;主要供给主…

【k8s管理--两种方式安装prometheus】

1、k8s的监控方案 1.1 Heapster Heapster是容器集群监控和性能分忻工具&#xff0c;天然的支持Kubernetes和CoreOS。 Kubernetes有个出名的监控agent–cAdvisor。在每个kubernetes Node上都会运行cAdvisor&#xff0c;它会收集本机以及容器的监控数(cpu,memory,filesystem,ne…

Matlab 机器人工具箱 RobotArm类

文章目录 1 RobotArm1.1 方法1.2 注意2 RobotArm.RobotArm3 RobotArm.cmove4 其他官网:Robotics Toolbox - Peter Corke 1 RobotArm 串联机械臂类 1.1 方法 方法描述plot显示机器人的图形表示teach驱动物理和图形机器人mirror使用机器人作为从机来驱动图形</

C++ 设计模式

文章目录 类图泛化实现关联聚合组合依赖总结 类内部的三种权限&#xff08;公有、保护、私有&#xff09;类的三种继承方式描述与图总结 面向对象七大原则单一职责原则&#xff08;Single Responsibility Principle&#xff09;里氏替换原则&#xff08;Liskov Substitution Pr…

C3_W2_Collaborative_RecSys_Assignment_吴恩达_中英_Pytorch

Practice lab: Collaborative Filtering Recommender Systems(实践实验室:协同过滤推荐系统) In this exercise, you will implement collaborative filtering to build a recommender system for movies. 在本次实验中&#xff0c;你将实现协同过滤来构建一个电影推荐系统。 …

【Memory协议栈】Memory Abstraction Interface模块介绍

目录 前言 正文 1.功能简介 2.关键概念 3.关键类型定义 3.1 MemIf_StatusType 3.2 MemIf_JobResultType 3.3 MemIf_ModeType 4.关键API定义 4.1 MemIf_SetMode 4.2 MemIf_Read 4.3 MemIf_Write 4.4 MemIf_Cancel 4.5 MemIf_GetStatus 4.6 MemIf_GetJobResult 4…

「滚雪球学Java」:集合(章节汇总)

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Ocr之PaddleOcr模型训练

目录 一、系统环境 1 镜像拉取ppocr 进行部署 2 安装paddlepaddle 二、训练前的准备 1 下载源码 2 预模型下载 3 修改模型训练文件yml 4 编排训练集 5 执行脚本进行训练 6 需要修改文件夹名称 三、开始训练 1 执行训练命令 2 对第一次评估进行解释 3 引言 五、总…

【解决方案】ArcGIS Engine二次开发时,运行后出现“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain...”

我们在做ArcGIS Engine二次开发时&#xff0c;特别是新手&#xff0c;安装好了开发环境&#xff0c;满怀信心的准备将按照教程搭建好的框架在Visual Studio中进行运行。点击运行后&#xff0c;却出现了“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化…

2023年09月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

一、单选题(共15题,共30分) 第1题 人们所使用的手机上安装的 App 通常指的是( )。 A:一款操作系统 B:一款应用软件 C:一种通话设备 D:以上都不对 答案:B 第2题 下列流程图的输出结果是?( ) A:9 B:7 C:5 D:11 答案:A 第3题 默认小猫角色,执行下列程序…

【Linux】软件管理yum | 编辑器vim | vim插件安装

目录 1. Linux软件管理yum 1.1 什么是软件包 1.2 查看软件包 1.3 如何安装软件 1.4 如何卸载软件 2. Linux编辑器vim 2.1 vim的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行模式命令集 2.5 简单vim配置 2.6 插件安装 1. Vim-Plug 3. coc.nvim …