码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • “滑动窗口”算法专项训练


    目录

    题目链接:长度最小的子数组

    题目描述

    思路分析:滑动窗口(利用单调性,使用"同向双指针'来优化)

    细节处理

    画图解析

    代码

    题目链接:最大连续1的个数 III

    题目描述

    思路分析:滑动窗口(同向双指针)

    细节处理

    画图解析

    代码

    题目链接:将 x 减到 0 的最小操作数

    题目描述

    思路分析: 滑动窗口(同向双指针)

    细节处理

    画图解析

    代码


    题目链接:长度最小的子数组

    题目描述

    思路分析:滑动窗口(利用单调性,使用"同向双指针'来优化)

    1. 定义左右指针left和right
    2. right指针进入窗口
    3. while(判断是否满足窗口内部和的值大于等于目标值的条件
    4. 更新最小长度以及窗口和的值
    5. left出窗口 )

    细节处理

    • 单调性规避了很多没必要的枚举行为,因为在找到满足条件的窗口和之后,right指针继续进入窗口的长度肯定比原来的大,所以找到满足条件的窗口和之后应该出窗口
    • 同向双指针指的是left和right都是往一个方向移动,不会回退 

    画图解析

    代码

    1. public int minSubArrayLen(int target,int[]nums) {
    2. int n= nums.length,len=Integer.MAX_VALUE,sum=0;
    3. for (int left = 0,right=0; right < n; right++) {
    4. //进窗口
    5. sum+=nums[right];
    6. while (sum>=target){//判断
    7. len=Math.min(len,right-left+1);
    8. sum-=nums[left];
    9. left++;//出窗口
    10. }
    11. }
    12. return len==Integer.MAX_VALUE?0:len;
    13. }

    题目链接:最大连续1的个数 III

    题目描述

     

    思路分析:滑动窗口(同向双指针)

    1. 定义左右指针left和right以及统计0的个数zero
    2. right指针进入窗口
    3. while(判断是否满足窗口内部zero的值大于等于最多反转个数k的条件
    4. left出窗口)
    5. 更新最长长度

    细节处理

    在找到超过反转个数的right位置时,left不用走一步就更新一次,因为在刚找到的那个位置的长度一定比left往后面一步一步走的长度长(例1比例2长)

    画图解析

    代码

    1. public int longestOnes(int[] nums, int k) {
    2. int n=nums.length,zero=0,len=0;
    3. for (int right = 0,left=0; right < n; right++) {
    4. if(nums[right]==0) zero++;//进窗口
    5. while (zero>k){//判断
    6. if(nums[left]==0) zero--;//出窗口
    7. left++;
    8. }
    9. len=Math.max(len,right-left+1);
    10. }
    11. return len;
    12. }

    题目链接:将 x 减到 0 的最小操作数

    题目描述

    思路分析: 滑动窗口(同向双指针)

    1. 定义左右指针left,right和数组总和sum,窗口长度len=-1
    2. right进入窗口得到temp
    3. whlie(判断sum是否大于temp
    4. 是的话left出窗口)
    5. 如果sum==target则更新结果长度len,取最大
    6. 用数组总长度-窗口满足条件的最大长度即得到结果

     

    细节处理

    • 巧妙转化:遇难则反,将问题转化为求数组总和减去目标数的窗口的最长长度,数组总长度减去最长长度即可得到最小操作数。
    • 当right走到sum>=target位置时,left++,right不用回退left再走一遍,因为right还是要走到当前位置才满足条件。left需要走是因为如果sum>target,那left出窗口可能会找到sum==target

    画图解析

    代码

    1. public int minOperations(int[] nums, int x) {
    2. int sum=0;
    3. int n=nums.length;
    4. int len=-1;
    5. for (int i : nums) sum+=i;
    6. int target=sum-x;
    7. // 如果x的值大于所有数之和,直接返回-1
    8. if(target<0) return -1;
    9. for (int right = 0,left=0,temp=0; right < n ; right++) {
    10. temp+=nums[right];//进窗口
    11. while (temp>target){//判断
    12. temp-=nums[left];
    13. left++;//出窗口
    14. }
    15. if(temp==target){
    16. len=Math.max(len,right-left+1);//更新结果
    17. }
    18. }
    19. if(len==-1) return len;
    20. else return n-len;
    21. }
  • 相关阅读:
    我是怎么定位线上问题的?
    word 如何编写4x4矩阵
    按位与最大的最长连续子数组
    9.8C++作业
    类和对象:构造函数,析构函数与拷贝构造函数
    AWS SAA-C03 #152
    copilot 产生 python工具函数并生成单元测试
    【附源码】Python计算机毕业设计税务综合信息平台
    基于Jenkins实现的CI/CD方案
    word、excel、ppt、pptx转为PDF
  • 原文地址:https://blog.csdn.net/m0_75100464/article/details/132664802
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号