滑动窗口系列(定长滑动窗口长度)8/31

1.长度为K子数组中的最大和

给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和:

  • 子数组的长度是 k,且
  • 子数组中的所有元素 各不相同 
题意:

在之前题目的基础上添加了一个条件:子数组中的所有元素各不相同 。

因此在这里使用哈希表记录元素出现的次数

思路:

在循环中

1.首先要判断该数字之前是否出现过? 如果出现过,就要将滑动窗口的左边界移动到该数字的下一个。

            while (map.getOrDefault(nums[right], 0) != 0) {map.put(nums[left], map.get(nums[left]) - 1);sum -= nums[left];left++;}

2.然后sum累计求和(第一步中判断了没有出现过才加的),如果滑动窗口的长度==k,此时更新一下最大值,然后移动滑动窗口的左边界并且更新一下哈希表;

            sum += nums[right];map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);if (right - left + 1 == k) {max = Math.max(max, sum);sum -= nums[left];map.put(nums[left], map.get(nums[left]) - 1);left++;}

3.返回最大值

代码:
 class Solution {public long maximumSubarraySum(int[] nums, int k) {long max = 0;int left = 0;int right = 0;long sum = 0;Map<Integer, Integer> map = new HashMap<>();while (right < nums.length) {while (map.getOrDefault(nums[right], 0) != 0) {map.put(nums[left], map.get(nums[left]) - 1);sum -= nums[left];left++;}sum += nums[right];map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);if (right - left + 1 == k) {max = Math.max(max, sum);sum -= nums[left];map.put(nums[left], map.get(nums[left]) - 1);left++;}right++;}return max;}
}

2.爱生气的书店老板(有点绕)

题意:

有一个书店,开了n分钟,每一分钟会进x个人,用数组customers表示;这老板脾气有点大,每一分钟可能会生气,用数组grumpy表示;如果生气的话,顾客就会不满意;但是老板有一个秘诀,会抑制生气,只能抑制minutes分钟;求n分钟最多满意的顾客有多少人?

输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3
输出:16
解释:书店老板在最后 3 分钟保持冷静。
感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
思路:

1.首先假设不会抑制情绪,那么顾客数为最少的,人数记为basic;

   for(int i=0;i<customers.length;i++){if(grumpy[i]==0)basic+=customers[i];}

2.选择在何时抑制情绪,这里可以使用滑动窗口的思路;

   2.1 遍历数组,如果该分钟老板是生气的,那么顾客数就要在basic的基础上增加

   2.2 然后要判断滑动窗口的长度,如果==minutes,那么就要更新最大值,并且更新滑动窗口的边           界    

        while(right<customers.length){if(grumpy[right]==1)basic+=customers[right];if(right-left+1==minutes){max=Math.max(max,basic);if(grumpy[left]==1)basic-=customers[left];left++;}right++;}
代码:
class Solution {public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {int left=0;int right=0;int max=Integer.MIN_VALUE;int basic=0;for(int i=0;i<customers.length;i++){if(grumpy[i]==0)basic+=customers[i];}while(right<customers.length){if(grumpy[right]==1)basic+=customers[right];if(right-left+1==minutes){max=Math.max(max,basic);if(grumpy[left]==1)basic-=customers[left];left++;}right++;}return max;}
}

3.子串出现的最大次数()

题意:

给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数:

  • 子串中不同字母的数目必须小于等于 maxLetters 。
  • 子串的长度必须大于等于 minSize 且小于等于 maxSize 。
输入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4
输出:2
解释:子串 "aab" 在原字符串中出现了 2 次。
它满足所有的要求:2 个不同的字母,长度为 3 (在 minSize 和 maxSize 范围内)。
思路:只需要看minSize就可以,因为长度为maxSize的字符串一定是覆盖长度为minSIze的字符串的;eg:bcdabcdabcdabc minSize=3 maxSize=4 abcd会出现3次,abcd出现abc一定出现;

因此这道题就变成了,滑动窗口长度为minSize,寻找不同字母的数量要<=maxLetters的字符串。这个字符串可能有多个,返回一个数量最多的。

代码:
class Solution {public int maxFreq(String s, int maxLetters, int minSize, int maxSize) {int left=0;int right=0;int count=0;int max=0;Map<Character,Integer> map1=new HashMap<>();//记录滑动窗口中出现字母的次数Map<String,Integer> map2=new HashMap<>();//记录符合字符串出现的次数while(right<s.length()){char ch=s.charAt(right);if(map1.getOrDefault(ch,0)==0)count++;map1.put(ch,map1.getOrDefault(ch,0)+1);if(right-left+1==minSize){if(count<=maxLetters){String str=s.substring(left,right+1);map2.put(str,map2.getOrDefault(str,0)+1);max=Math.max(max,map2.get(str));}map1.put(s.charAt(left),map1.get(s.charAt(left))-1);if(map1.get(s.charAt(left))==0)count--;left++;}right++;}return max;}
}

4.最小交换次数来组合所有的1 II

题意:

交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。

环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。

给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。

思路:

要组合所有的1,我们可以将滑动窗口的长度设置为1的个数;

如果滑动窗口中0的个数为0:就不需要交换,交换次数为0;

如果滑动窗口中0的个数为1:就需要将1和这个0交换,交换次数为1;

因此,0的个数就是需要交换的个数;

因此只需要使用滑动窗口判断里面0的个数即可。并且更新最小值;

注意:是循环数组

left和right的增加都需要对size取余

代码:
class Solution {public int minSwaps(int[] nums) {//计算窗口的长度(数组中1的个数就是窗口的长度)int windowSize=0;for(int num:nums)if(num==1)windowSize++;int left=0;int right=0;int res=Integer.MAX_VALUE;int count=0;int index=0;while(index<windowSize+nums.length-1){if(nums[right]==0)count++;if(right-left+1==windowSize||right+nums.length-left+1==windowSize){res=Math.min(res,count);if(nums[left]==0)count--;left=(left+1)%nums.length;}right=(right+1)%nums.length;index++;}return res==Integer.MAX_VALUE?0:res;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

22. LinkedHashMap和HashMap有什么区别?为什么LinkedHashMap能保持元素的插入顺序?

LinkedHashMap 和 HashMap 都是 Java 中用于存储键值对的集合类&#xff0c;但它们在一些关键特性上有所不同&#xff0c;尤其是在元素的顺序和性能方面。以下是它们之间的主要区别&#xff1a; 1. 元素的顺序 HashMap: HashMap不保证元素的顺序。元素的顺序可能会在插入、删除…

453.最小操作次数使数组元素相等

453.最小操作次数使数组元素相等 给你一个长度为 n 的整数数组&#xff0c;每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;3 解释&#xff1a; 只需要3次操作&#xff08;…

全国设计院排名 境外工程项目管理营业额二〇二三年排名

境外工程项目管理营业额二〇二三年排名 单位&#xff1a;万元人民币 序号 公 司 名 称 营业额 1 中国铁路设计集团有限公司 37,515 2 中冶南方工程技术有限公司 12,453 3 中国恩菲工程技术有限公司 8,940 4 中冶华天工程技术有限公司 7,646 5 中国电建集团华东…

为什么echarts极坐标柱形图的图形显示的特别小呢??如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

最新Vmware17的WIn10虚拟机开箱即用,免安装

这篇文章分享的Vmware安装Win10的教程&#xff0c;如过有些懒得装Win10的同学可以会直接使用我的WIn10镜像压缩包打开即可 Win10镜像压缩包下载 tips&#xff1a;⬆️⬆️包含Vmware17安装包 使用方法&#xff0c;打开Vmware

皕盛电商平台:为合作伙伴提供广阔的发展空间

随着互联网的快速发展&#xff0c;我国电商行业已经取得了显著的成果&#xff0c;越来越多的企业和个人投身于电商领域。在众多电商平台中&#xff0c;皕盛电商平台以其独特的方式&#xff0c;为消费者、商家和合作伙伴创造了一个全新的电商生态圈。 一、关于皕盛电商平台 皕…

Redis集群搭建以及用idea连接集群

一、redis的集群搭建&#xff1a; 判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数&#xff0c;搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。…

零基础学习Redis(7) -- hash类型命令使用

Redis本身就是通过哈希表的方式组织数据&#xff0c;同时redis中的value也可以是另一个哈希表。 1. 常用命令 1. hset / hsetnx hset key filed1 value1 filed2 value2 ... hset 用于把键值对存入value中&#xff0c;这里的key为redis组织的键&#xff0c; filed1 value1 fil…

JavaWeb笔记整理10——JWT令牌、Filter、Interceptor

目录 1.简介 2.生成和校验 3.登录-生成令牌 4.过滤器Filter 快速入门 Filter执行流程 Filter拦截路径 过滤器链 登录校验Filter 流程 代码 5.拦截器Interceptor 快速入门 Interceptor拦截路径 执行流程 代码 继笔记04-session cookie 1.简介 2.生成和校验 /*…

【秋招笔试】8.31京东秋招(研发岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

计算机毕业设计选题推荐-摇滚音乐鉴赏网站-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

滑动窗口系列(定长滑动窗口长度) 8/30

1.所有数对中 数位差之和() 题意&#xff1a; 给定一个nums数组&#xff0c;计算中所有整数数对中 数位差的个数之和&#xff1b; 数位差&#xff1a;某一位上的数字不一样就记作数位差。 eg:12 22; 十位上不一样&#xff0c;数位差为1 思路&#xff1a; 首先计算出一个数…

Linux信号处理机制基础

什么是信号 信号在最早的UNIX系统中即被引入&#xff0c;已有30多年的历史&#xff0c;但只有很小的变化。信号是提供异步事件处理机制的软件中断。进程之间可以相互发送信号&#xff0c;这使信号成为一种进程间通信(Inter-ProcessCommunication,lPC)的基本手段 信号的名称与…

splunk Enterprise 的HTTP收集器-windows

1.创建HTTP收集器 2.使用HTTP收集器 然后打开全局设置&#xff1a;把ssl给去掉&#xff0c;点保存&#xff08;保存之后&#xff0c;可以看到这些状态全部都是已启用了&#xff09;&#xff1a; 3.测试&#xff1a; curl --location --request POST http://192.168.11.131:808…

【自动驾驶】决策规划算法概述

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

卷积神经网络(CNN):算法、原理与应用

卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09;是深度学习领域中的重要算法之一&#xff0c;尤其在计算机视觉任务中表现出色。本文将从基础原理、核心组件、以及应用场景三个方面理解卷积神经网络的强大之处。 卷积神经网络的基本概念 卷积神经网…

u盘pe怎么安装系统_u盘pe安装系统详细步骤

u盘pe怎么安装系统&#xff1f;u盘pe安装系统需要准备一个u盘&#xff0c;然后将u盘制作成pe&#xff0c;进入pe后再安装系统&#xff0c;下面小编就教大家u盘pe安装系统详细步骤教程。 u盘pe启动盘是什么&#xff1f; u盘pe启动盘是一种可引导的USB存储设备&#xff0c;其中包…

10:Logic软件原理图中添加电源与GND

Logic软件原理图中添加电源与GND

Hive的存储格式

文章目录 Hive的存储格式1.存储格式简介2.行存储与列存储行式存储列式存储混合的 PAX 存储结构 TextFileSequenceFile Hive的存储格式 1.存储格式简介 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE(默认格式) 、SEQUENCEFILE、RCFILE、ORCFILE、PARQUET。 textfile为默…

续:docker 仓库数据传输加密

上一个实验&#xff1a;非加密的形式在企业中是不被允许的。 示例&#xff1a;【为Registry 提供加密传输】 因为传输也是https&#xff0c;所以与ssh一样的加密。 ## 这种方式就不用写这个了。 [rootdocker ~]# cat /etc/docker/daemon.json #{ # "insecure-registrie…