当前位置: 首页 > news >正文

【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

1. 长度最小的子数组 - 力扣(LeetCode)

1.题目解析:

2.算法原理

(1)方法一:暴力列举出所有的子数组的和

时间复杂度:O(n**2):枚举所有子数组O(n**2)

(2)方法二:

利用单调性(两个指针都不回退),使用"同向双指针"(其实就是滑动窗口)来优化

那么滑动窗口过程是怎么样的?

<1>left  = 0,rght  = 0

<2>进窗口

<3>判断 并决定什么时候出窗口

(其中二三步是循环的)

还有一步更新结果:这一步可能在<2>,也可能在<3>

以【2,3,1,2,4,3】为例模拟这个过程

开始left和right都指向2(第一个元素),

然后开始进窗口(right++),right指向3,sum从0变为2,

然后进行判断,如果sum>target,更新结果并出窗口(也就是left++);如果sum<=target,继续进窗口(也就是right++)

正确性验证:

利用单调性,规避了很多没有必要的枚举行为(也就是当 sum>target时,right不用继续++)

 时间复杂度:O(N)

最坏情况:left和right都走到数组的最后,也就是N+N=2N

3.代码实现

class Solution {public int minSubArrayLen(int target, int[] nums) {int sum = 0;int ret = Integer.MAX_VALUE;for(int left=0,right=0;right<nums.length;right++) {sum+=nums[right];//进窗口while(sum>=target) {//判断ret = Math.min(right-left+1,ret);//更新结果sum-=nums[left];left++;}}//要考虑特殊情况:不存在return ret==Integer.MAX_VALUE ? 0:ret;}
}

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

1.题目解析:

2.算法原理

方法一:暴力枚举 + 哈希表(判断字符是否重复出现) 

时间复杂度:O(N**2)

方法二:利用规律,使用滑动窗口来解决问题

<1>left  = 0,rght  = 0

<2>进窗口(right++)—>让字符进入哈希表

<3>判断(窗口内是否出现重复字符)

有重复字符就出窗口(left++),从哈希表中删除该字符,这个过程需要一直重复,直到left找到重复的字符

<4>更新结果:在出完窗口到没有重复字符后就统计结果

3.代码实现

class Solution {public int lengthOfLongestSubstring(String s) {char[] ss = s.toCharArray();//字符串转为字符数组int[] hash = new int[128]; //用数组模拟哈希表int len = 0;for(int left=0,right=0;right<s.length();right++) {//进窗口hash[ss[right]]++;while(hash[ss[right]]>1) {//有重复字符//删除hash[ss[left]]--;//出窗口left++;}//更新结果len = Math.max(len,right-left+1);}return len;}
}

3. 最大连续1的个数 III - 力扣(LeetCode)

1.题目解析:

2.算法原理:

问题转化:找出最长的子数组,0的个数不超过k个

方法一:暴力枚举+zero计数器

方法二:在暴力的情况下不让right回退—>滑动窗口

<1>left  = 0,rght  = 0

<2>进窗口:right++,如果是1,无视;如果是0,计数器+1

<3>判断(zero>k) 并决定什么时候出窗口(left++,计数器-1)

<4>更新结果:出窗口结束

3.代码实现:

class Solution {public int longestOnes(int[] nums, int k) {int count=0;int zero=0;for(int left=0,right=0;right<nums.length;right++) {//进窗口if(nums[right]==0){zero++;}while(zero>k) {//判断:0的个数超过k个//出窗口if(nums[left]==0) {zero--;}left++;}count=Math.max(count,right-left+1);}return count;}
}

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

1.题目解析:

2.算法原理:

正难则反:找出最长的子数组的长度(len),所有元素的和正好等于sum-x(target),那么最后求的就是n-len的最小值

<1>left  = 0,rght  = 0

<2>进窗口—>Sum+=nums[right]

<3>判断 Sum>target(此处不应该有==,因为要等于不能出窗口)

并决定什么时候出窗口—>sum-=nums[left]

<4>更新结果:这个时候需要加上判断sum==target

3.代码实现:

class Solution {public int minOperations(int[] nums, int x) {int Sum=0;for(int a:nums) Sum+=a;int sum=0;int target = Sum-x;//处理细节if(target<0) {return -1;}int ret=-1;for(int left=0,right=0;right<nums.length;right++) {//进窗口sum+=nums[right];//判断while(sum>target) {//出窗口sum-=nums[left++];}//更新结果if(sum==target) {ret=Math.max(right-left+1,ret);}}return (ret==-1)?(-1):(nums.length-ret);}
}

相关文章:

  • EPSON XV4001BC陀螺仪传感器汽车导航系统的应用
  • LabVIEW NV色心频率扫描
  • C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码
  • 热插拔技术详解(中)
  • Python分析无人驾驶汽车在桂林市文旅行业推广的问卷
  • Java基础-IO流
  • neo4j使用详解(一、Linux安装)
  • 什么是Spring Boot
  • 【Greenhills】MULTI IDE-GHS最新版本Compiler 23.5.4的兼容性问题
  • 如何查看局域网内所有的ip和对应的mac地址
  • Django单表数据库操作
  • OpenSearch 2.x 版本文档部署 CSS 丢失的问题
  • 后端开发要不要转鸿蒙?
  • 在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果
  • 【工具】Docker 入门及常用指令
  • [NodeJS] 关于Buffer
  • 【刷算法】求1+2+3+...+n
  • 10个确保微服务与容器安全的最佳实践
  • CentOS从零开始部署Nodejs项目
  • Java 多线程编程之:notify 和 wait 用法
  • Java 最常见的 200+ 面试题:面试必备
  • JAVA并发编程--1.基础概念
  • markdown编辑器简评
  • Mysql数据库的条件查询语句
  • php ci框架整合银盛支付
  • PHP变量
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 我与Jetbrains的这些年
  • 用jquery写贪吃蛇
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 字符串匹配基础上
  • k8s使用glusterfs实现动态持久化存储
  • # centos7下FFmpeg环境部署记录
  • #FPGA(基础知识)
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Java)【深基9.例1】选举学生会
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (动态规划)5. 最长回文子串 java解决
  • (简单) HDU 2612 Find a way,BFS。
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转载)虚函数剖析
  • ***详解账号泄露:全球约1亿用户已泄露
  • **PHP二维数组遍历时同时赋值
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • . NET自动找可写目录
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • @staticmethod和@classmethod的作用与区别
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色