【算法】——滑动窗口专题

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:长度最小的子数组

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

三:最大连续1的个数

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

五:水果成篮

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

七:串联所有单词的子串

八:最小覆盖子串


一:长度最小的子数组

 

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0 , right = 0 , sum = 0 , n = nums.length;
        int len = Integer.MAX_VALUE;
        
        for(;right < n ; right++){
            //进入窗口
            sum += nums[right];
            while(sum >= target){
                //更新值
                len = Math.min(len,right - left + 1);
                //出窗口
                sum -= nums[left];
                left++;
            }
        }
        return len == Integer.MAX_VALUE ? 0 : len; 
        
        


    }
}

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

3. 无重复字符的最长子串 - 力扣(LeetCode)

class Solution {
    public int lengthOfLongestSubstring(String ss) {
        int left = 0 , right = 0 , ret = 0;
        char[] s = ss.toCharArray();
        int n = s.length;
        int[] hash = new int[128];
        while(right < n){
            hash[s[right]]++;
            while(hash[s[right]] > 1){
                hash[s[left++]]--;//出窗口
            }
            ret = Math.max(ret , right - left + 1);
            right++;
        }
        return ret;

    }
}

三:最大连续1的个数

class Solution {
    public int longestOnes(int[] nums, int k) {
        int left = 0 , right = 0 , count = 0;
        int n = nums.length , ret = 0;
        while(right < n){
            if(nums[right] == 1){
                right++;
            }else{
                count++;
                right++;
            }
            while(count > k){
                if(nums[left] == 1){
                    left++;
                }else{
                    count--;
                    left++;
                }
                
            }
            

            ret = Math.max(ret,right-left);

        } 
        return ret;

    }
}

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

1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

class Solution4 {
    public int minOperations(int[] nums, int x) {
        int left = 0 , right = 0 , count = 0 ,sum = 0;
        int n = nums.length;
        for(int i = 0 ; i < n ; i++){
            sum += nums[i];
        }
        int target = sum - x , tem = 0;
        if(target < 0){
            return -1;
        }
        if(target == 0){
            return n;
        }
        for(; right < n ; right++){
            //进窗口不判断
            tem += nums[right];
            while(tem > target ){
                tem -= nums[left];
                left++;
            }//执行顺序也有讲究,最后一步判断
            if(tem == target){
                count = Math.max(count , right-left+1);
            }
        }
        if(count == 0){
            return -1;
        }
        return n-count;
    }
}

五:水果成篮

904. 水果成篮 - 力扣(LeetCode)

class Solution {
    public int totalFruit(int[] f) {
        Map<Integer,Integer> hash = new HashMap<Integer,Integer>();
        int ret = 0;
        for(int left = 0 , right = 0 ; right < f.length ; right++){
            //进窗口
            int in = f[right];
            hash.put(in,hash.getOrDefault(in,0)+1);
            while(hash.size() > 2){//判断
                //出窗口
                int out = f[left];
                hash.put(out,hash.get(out)-1);
                if(hash.get(out) == 0){
                    hash.remove(out);
                }
                left++;
            }
            ret = Math.max(ret,right - left + 1);
        }
        return ret;
    }
}

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

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

 

class Solution {
    public List<Integer> findAnagrams(String ss, String pp) {
        List<Integer> list = new ArrayList<Integer>();
        char[] s = ss.toCharArray();
        char[] p = pp.toCharArray();

        int[] hashS = new int[26];
        int[] hashP = new int[26];

        for(char x : p){
            hashP[ x - 'a']++;
        }  

        for(int right = 0 , left = 0 , count = 0 ; right < ss.length() ; right++ ){
            char in = s[right];
            hashS[ in - 'a']++;
            if(hashS[in - 'a'] <= hashP[in - 'a']){
                count++;//进入的是有效字符
            }
            char out = s[left];
            if(right - left + 1 > pp.length()){
                hashS[out - 'a']--;
                if(hashS[out - 'a'] < hashP[out - 'a']){
                    count--;
                }
                left++;
            }
            if(count == pp.length()){
                list.add(left);
            }
        }
        return list;
        
    }
}

七:串联所有单词的子串

30. 串联所有单词的子串 - 力扣(LeetCode)

    class Solution8 {
        public List<Integer> findSubstring(String s, String[] words) {
            List<Integer> ret = new ArrayList<Integer>();
            //先把words中的元素放到HashMap中//每个元素的长度为m,数组长度为n,记录元素种类ele
            Map<String,Integer> hash1 = new HashMap<String,Integer>();
            int m = words[0].length() , n = words.length ,ele = 0;
            for(String ss : words){
                hash1.put(ss,hash1.getOrDefault(ss,0)+1);

            }



            for(int i = 0 ; i < m ; i++ ){
                //wc太绝了hashMap每次i移动时需要初始化一下,要不然上一次的值还存留在HashMap中
                Map<String,Integer> hash2 = new HashMap<String,Integer>();
                for(int left = i , right = i , count = 0 ; right + m <= s.length()  ; right += m){
                    //进窗口
                    String in = s.substring(right,right+m);
                    hash2.put(in,hash2.getOrDefault(in,0)+1);
                    //判断count加不加
                    if(hash2.get(in) <= hash1.getOrDefault(in,0)){
                        count++;
                    }
                    //出窗口
                    while(right - left + 1 > m * n ){
                        String out = s.substring(left,left+m);
                        left+=m;
                        if(hash2.get(out) <= hash1.getOrDefault(out,0)){
                            count--;
                        }
                        hash2.put(out,hash2.get(out)-1);
                    }
                    if(count == n){
                        ret.add(left);
                    }


                }
            }
            return ret;

        }
    }

八:最小覆盖子串

76. 最小覆盖子串 - 力扣(LeetCode)

class Solution {
    public String minWindow(String ss, String tt) {
       //先把要找的字符tt转化为数组并放到哈希表里
       char[] t = tt.toCharArray();
       int[] hash1 = new int[128];
       int kind = 0;//统计tt字符串中有多少种字符
       for(char ch : t){
            hash1[ch]++;
            if(hash1[ch] == 1){
                kind++;
            }
       }

       //同样把字符ss转化为数组
       char[] s = ss.toCharArray();
       int[] hash2 = new int[128];
       int len = Integer.MAX_VALUE;
       int left = 0 , right = 0 , begin = -1 ;
       
       for(int count = 0; right < s.length ; right++){
             //进窗口
            char in = s[right];
            hash2[in]++;
            //判断如果直接判断两个哈希表非常耗费时间引入count
            if(hash1[in] == hash2[in]){
                count++;
            }

            
            //更新结果(如果种类一直相同,那就一直出窗口所以用while)
            while(count == kind){
                if(right - left + 1 < len){
                    begin = left;
                    len = right-left+1;
                }

                //出窗口
                char out = s[left++];
                if(hash2[out] == hash1[out] ){//考虑两种情况,出的是有效字符还是无效字符
                    count--;
                }
                hash2[out]--;  
                
            }
            
       }
            //for循环走完了一直进不去while循环,返回空字符串
            if(len == Integer.MAX_VALUE){
                    return new String();
            }else{
                String ret = ss.substring(begin,begin+len);
                return ret;
            }
       
        
    }
}

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

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

相关文章

目前主流的人工智能学习框架有哪些?

随着人工智能&#xff08;AI&#xff09;技术的蓬勃发展&#xff0c;越来越多的AI学习框架相继推出&#xff0c;成为开发者、研究人员和企业构建机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09;模型的首选工具。AI学习框架不仅提供了丰富的工具库和函…

揭开自然语言处理(NLP)的神秘面纱

时间&#xff1a;2024年 11月 05日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术” &#xff0c;我是小蒋&#xff01;。小蒋最近在学习清华大模型课程&…

C#:强大而优雅的编程语言

在当今的软件开发领域&#xff0c;C#作为一种广泛应用的编程语言&#xff0c;以其强大的功能、优雅的语法和丰富的生态系统&#xff0c;受到了众多开发者的喜爱。本文将深入探讨 C#的各个方面&#xff0c;展示它的魅力和优势。 一、C#的历史与发展 C#是由微软公司开发的一种面…

SQL CASE表达式与窗口函数

CASE 表达式是一种通用的条件表达式&#xff0c;类似于其他编程语言中的if/else语句。 窗口函数类似于group by&#xff0c;但是不会改变记录行数&#xff0c;能扫描所有行&#xff0c;能对每一行执行聚合计算或其他复杂计算&#xff0c;并把结果填到每一行中。 1 CASE 表达式…

C++之位算法

位算法 常见位运算总结 位1的个数 给定一个正整数 n&#xff0c;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;3 解释…

【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案

&#x1f984;个人主页: 起名字真南 &#x1f984;个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 题目分析示例&#xff1a; 3. 解题思路4. C代码实现5. 代码详解6. 时间和空间复杂度分析7. 边界情况分析8. 总结 1. 引言 在开发中&#xff0c;有时我们…

用Python将PDF表格提取到文本、CSV和Excel文件中

从PDF文档中提取表格并将其转换为更易于处理的格式&#xff08;如文本、CSV和Excel文件&#xff09;&#xff0c;是数据分析和信息管理中的常见需求。此过程可显著简化表格数据的处理&#xff0c;使数据的操作、分析和与其他数据集的集成更加便捷。无论是财务报表、研究论文&am…

如何在 IntelliJ IDEA 中调整 `Ctrl+/` 快捷键生成注释的位置

前言 在使用 IntelliJ IDEA 编写代码时&#xff0c;注释是代码可读性和维护性的重要组成部分。IDEA 提供了快捷键 Ctrl/ 用于快速生成单行注释。然而&#xff0c;默认情况下&#xff0c;使用此快捷键生成的注释会出现在行首&#xff0c;导致注释与代码之间存在较大的空格&…

深入理解对象池 sync.Pool

文章目录 前言应用使用源码走读数据结构Get获取对象Put归还对象poolDeque分析GC时 总结 前言 当多个 goroutine 都需要创建同⼀种对象的时候&#xff0c;如果 goroutine 数量过多&#xff0c;导致对象的创建剧增&#xff0c;进⽽导致 GC 压⼒增大。形成下面的恶性循环&#xf…

项目管理(软设软考高频)

一、进度管理 1.Gantt图 2.PERT图 二、风险管理 三、沟通管理 四、成本管理

在Java中,实现数据库连接通常使用JDBC

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

gradle下载的jar包,源码出现Decompiled .class file, bytecode version

如下是问题截图 问题产生原因&#xff1a; gradle依赖下载只下载了jar包&#xff0c;这导致idea在读取jar包时&#xff0c;需要通过Fernflower技术对jar包进行反编译&#xff0c;而反编译过程中只会保留源码信息&#xff0c;因此注释等额外信息全部丢失 解决方案&#xff1a…

[357]基于springboot的中小型制造企业质量管理系统

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

SAP(PP生产制造)拆解工单业务处理

1、BOM维护 要拆解的成品或半成品要和原成品、半成品BOM一致 2、创建拆解工单 CO01选择拆解工单的类型&#xff0c;以及填写拆解的物料和拆解工厂 维护工单组件 注意&#xff1a; 1、拆解入库组件的数量需要维护为负数 2、拆解工单投料组件数量维护为正数 3、拆解工单收发…

NavVis LX系列产品典型应用—现有住宅装修改造-沪敖3D

现有住宅装修改造项目的 数据捕捉和测量技术 当Jay Ure着手翻新和美化自己的新家时&#xff0c;他敏锐地发现这是现场测试NavVis VLX的绝佳机会。 为了全面评估&#xff0c;他聘请了一位工程师&#xff0c;采用传统的全站仪技术进行地形测绘。之后&#xff0c;他用移动扫描设…

【初阶数据结构篇】链式结构二叉树(续)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-多线程超详细讲解(5)_单例模式与线程池 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&a…

Spark中的宽窄依赖

一、什么是依赖关系 这里通过一张图来解释&#xff1a; result_rdd是由tuple_rdd使用reduceByKey算子得到的&#xff0c; 而tuple_rdd是由word_rdd使用map算子得到的&#xff0c;word_rdd又是由input_rdd使用flatMap算子得到的。它们之间的关系就称为依赖关系&#xff01; 二…

[每周一更]-(第121期):模拟面试|微服务架构面试思路解析

这一系列针对Go面试题整理,仅供参考 文章目录 00|综合服务治理方案:怎么保证微服务应用的高可用?1. **什么是微服务架构?**2. **怎么保证微服务架构的高可用?**3. **怎么判定服务是否已经健康?**4. **如果服务不健康该怎么办?**5. **怎么判定服务已经从不健康状态恢复过…