Hot100之子串

560和为K的子数组

题目

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数

子数组是数组中元素的连续非空序列

思路解析

ps:我们的presum【0】就是0,如果没有这个0的话我们的第一个元素就无法减去上一个元素,为了让我们的第一个元素也能参与前缀和减法,所以我们的presum【0】就是0

我们首先收集前缀和

然后我们两个for循环,里面前缀和作差

然后count++收集答案

代码

class Solution {public int subarraySum(int[] nums, int k) {//前缀和数组int[] presum = new int[nums.length+1];for (int i = 0; i < nums.length; i++) {//这里需要注意,我们的前缀和是presum[1]开始填充的presum[i+1] = nums[i] + presum[i];}//统计个数int count = 0;for (int i = 0; i < nums.length; ++i) {for (int j = i; j < nums.length; ++j) {//注意偏移,因为我们的nums[2]到nums[4]等于presum[5]-presum[2]//所以这样就可以得到nums[i,j]区间内的和if (presum[j+1] - presum[i] == k) {count++;}}}return count;}
}

239滑动窗口的最大值

题目

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位

思路解析

简单的单调栈+滑动窗口思想

我们维护栈内单调递减就行

当里面元素个数大于K的时候,我们就弹出第一个元素就好了

代码

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {Deque<Integer> deque = new ArrayDeque<>();int n = nums.length;// 初始化收集结果的数组int result[] = new int[n - k + 1];for (int i = 0; i < n; i++) {// 入while (!deque.isEmpty() && nums[deque.getLast()] <= nums[i]) {deque.removeLast(); // 维护q的单调性}deque.addLast(i); // 入队,这是把我们的下标给存进去if (i - deque.getFirst() >= k) {// 这个是我们的队首已经离开窗口了deque.removeFirst();}// 收集我们的答案if (i >= k - 1) {result[i - k + 1] = nums[deque.getFirst()];}}return result;}
}

前置知识--209长度最小的子数组

题目

思路解析

不断缩小左端点

代码

class Solution {public int minSubArrayLen(int target, int[] nums) {int left = 0, right = 0, n = nums.length;int min = Integer.MAX_VALUE;int sum = 0;while (right < n) {sum += nums[right];while (sum >= target) {min = Math.min(min, right - left + 1);sum -= nums[left];left++;}right++;}return min == Integer.MAX_VALUE ? 0 : min;}
}

76最小覆盖子串

题目

去看上一节的前置知识先

思路解析

字符数组的含义

我们把子串变成字符数组,父串变成字符数组

数组的逻辑是,我们遍历字符串,对特定的字符进行计数,也就是++

        char[] SChar = s.toCharArray();//子串的数组int m=s.length();//子串的长度int ansLeft=-1;int ansRight=m;int[] cntS=new int[128];//s子串的字母出现次数,s是子串int[] cntT=new int[128];//t字符串中字母出现的次数,t是父串//对父串中的字符的值进行初始化for(char c:t.toCharArray()){cntT[c]++;}
涵盖函数

然后我们弄个涵盖函数,判断当前字符串是否涵盖

如果父串里面的字符比子串多,我们返回false,说明这个子串没有涵盖父串的所有字符

如果子串里的字符数量都比子串多,那么说明这个子串没问题,这个子串涵盖了父串中的所有字符

 //如果父串里面的字符比子串多,我们返回false,说明这个子串并没有涵盖父串的所有字符//如果子串里的字符数量都比子串多,那么说明这个子串没问题,这个子串涵盖了父串中的所有字符private boolean isCovered(int[] cntS,int[] cntT){for(int i='A';i<='Z';i++){if(cntS[i]<cntT[i]){return false;}}for(int i='a';i<='z';i++){if(cntS[i]<cntT[i]){return false;}}return true;}
滑动窗口思想

我们遍历子串,操作子串

子串进入数组,然后根据我们的涵盖函数

如果涵盖+找到了更短的子串,那我们就计算最短长度然后记住left和right

然后弹出最左侧元素,也就是left++进行我们的滑动窗口的收缩

int left=0;for(int right=0;right<m;right++){//移动子串右端点cntS[SChar[right]]++;//右端点字母进入子串while(isCovered(cntS,cntT)){//涵盖if(right-left<ansRight-ansLeft){//找到了更短的子串ansLeft=left;ansRight=right;}cntS[SChar[left]]--;//左端点字母移出子串left++;}}return ansLeft<0?"":s.substring(ansLeft,ansRight+1);
为什么ansLeft要初始化成-1?

因为我们要是初始化成0的话,我们并不能判断是否找到了满足条件的子串,因为我们的最终的return函数是根据0来判断,我们是否移动了指针(即是否找到了一个满足条件的子串)

看看我们的return

  return ansLeft<0?"":s.substring(ansLeft,ansRight+1);

代码

class Solution {public String minWindow(String s, String t) {char[] SChar = s.toCharArray();//子串的数组int m=s.length();//子串的长度int ansLeft=-1;int ansRight=m;int[] cntS=new int[128];//s子串的字母出现次数,s是子串int[] cntT=new int[128];//t字符串中字母出现的次数,t是父串//对父串中的字符的值进行初始化for(char c:t.toCharArray()){cntT[c]++;}int left=0;for(int right=0;right<m;right++){//移动子串右端点cntS[SChar[right]]++;//右端点字母进入子串while(isCovered(cntS,cntT)){//涵盖if(right-left<ansRight-ansLeft){//找到了更短的子串ansLeft=left;ansRight=right;}cntS[SChar[left]]--;//左端点字母移出子串left++;}}return ansLeft<0?"":s.substring(ansLeft,ansRight+1);}//如果父串里面的字符比子串多,我们返回false,说明这个子串并没有涵盖父串的所有字符//如果子串里的字符数量都比子串多,那么说明这个子串没问题,这个子串涵盖了父串中的所有字符private boolean isCovered(int[] cntS,int[] cntT){for(int i='A';i<='Z';i++){if(cntS[i]<cntT[i]){return false;}}for(int i='a';i<='z';i++){if(cntS[i]<cntT[i]){return false;}}return true;}
}

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

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

相关文章

网络工程师 (11)软件生命周期与开发模型

一、软件生命周期 前言 软件生命周期&#xff0c;也称为软件开发周期或软件开发生命周期&#xff0c;是指从软件项目的启动到软件不再被使用为止的整个期间。这个过程可以细分为多个阶段&#xff0c;每个阶段都有其特定的目标、任务和产出物。 1. 问题定义与需求分析 问题定义…

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程&#xff1a; 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么&#xff1f; 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…

基于Spring Security 6的OAuth2 系列之七 - 授权服务器--自定义数据库客户端信息

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…

深入剖析C语言字符串操作函数:my_strlen与my_strcpy

在C语言的编程世界里&#xff0c;字符串操作是日常开发中极为常见的任务。熟练掌握字符串操作函数&#xff0c;不仅能够提高代码的效率和可读性&#xff0c;还能为解决各种实际问题提供有力的支持。本文将深入剖析两个自定义的字符串操作函数&#xff1a; my_strlen 和 my_strc…

《苍穹外卖》项目学习记录-Day10来单提醒

type&#xff1a;用来标识消息的类型&#xff0c;比如说type1表示来单提醒&#xff0c;type2表示客户催单。 orderId&#xff1a;表示订单id&#xff0c;因为不管是来单提醒还是客户催单&#xff0c;这一次提醒都对应一个订单。是用户下了某个单或者催促某个订单&#xff0c;这…

数据结构与算法之栈: LeetCode 2042. 检查句子中的数字是否递增 (Ts版)

检查句子中的数字是否递增 https://leetcode.cn/problems/check-if-numbers-are-ascending-in-a-sentence/description/ 描述 句子是由若干 token 组成的一个列表&#xff0c;token 间用 单个 空格分隔&#xff0c;句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 …

fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)

目录 创建工程创建源文件并编写C代码C仿真综合仿真导出RTL CG导出RTL错误处理&#xff1a; 创建工程 创建源文件并编写C代码 创建源文件(Souces下的hlsv.h和hlsv.cpp&#xff0c;Test Bench下的test_hlsv1.cpp)&#xff1a; hlsv1.h #ifndef HLSV1 #define HLSV1 #include &l…

JVM栈溢出线上环境排查

#查看当前Linux系统进程ID、线程ID、CPU占用率&#xff08;-eo后面跟想要展示的列&#xff09; ps H -eo pid,tid,%cpups H -eo pid,tid,%cpu |grep tid #使用java jstack 查看进程id下所有线程id的情况 jstack pid 案例2 通过jstack 排查死锁问题 #启动java代码 jstack 进…

91,【7】 攻防世界 web fileclude

进入靶场 <?php // 包含 flag.php 文件 include("flag.php");// 以高亮语法显示当前文件&#xff08;即包含这段代码的 PHP 文件&#xff09;的内容 // 方便查看当前代码结构和逻辑&#xff0c;常用于调试或给解题者提示代码信息 highlight_file(__FILE__);// 检…

Joplin 插件在Vscode中无法显示图片

1.问题 在vscode里面装好joplin插件之后&#xff0c;无法显示图片内容。 粘贴的图片可以再vscode中显示&#xff0c;无法再joplin客户端显示 2.解决方法 这种情况是因为和vscode自带的MD编辑器的预览模式有冲突&#xff0c;或者没用通过专用方式上传图片。 方法一&#xff…

FreeRTOS从入门到精通 第十七章(软件定时器)

参考教程&#xff1a;【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、软件定时器简介 1、定时器的概念与种类 &#xff08;1&#xff09;定时器的概念&#xff1a;从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xf…

2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文

模型设计思路与创新点&#xff1a; 建模的时候应该先确定我们需要建立什么类的模型&#xff1f;优化类还是统计类&#xff1f;这个题需要大量的数据分析&#xff0c;因此我们可以建立一个统计学模型。 统计学建模思路&#xff1a;观察规律&#xff0c;建立模型&#xff0c;参…

9.2k star!PiliPala一个第三方B站客户端!

软件介绍 链接 PiliPala一个在Github上收获9.2k star的开源第三方bilibili客户端&#xff0c;支持安卓和ios端安装使用。应用界面简洁无广、除核心功能外无任何冗余功能和服务&#xff0c;让我们可以尽情的享受内容带给我们的快乐。 基础的功能如登录、点赞收藏、评论、关注、…

unity学习23:场景scene相关,场景信息,场景跳转

目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景&#xff0c;在构建中包含的场景 &#xff08;否则会认为是失效的Scene&#xff09; 2.4 Scenes in Bui…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(五)

Understanding Diffusion Models: A Unified Perspective&#xff08;五&#xff09; 文章概括基于得分的生成模型&#xff08;Score-based Generative Models&#xff09; 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A…

Linux中 端口被占用如何解决

lsof命令查找 查找被占用端口 lsof -i :端口号 #示例 lsof -i :8080 lsof -i :3306 netstat命令查找 查找被占用端口 netstat -tuln | grep 端口号 #示例 netstat -tuln | grep 3306 netstat -tuln | grep 6379 ss命令查找 查找被占用端口 ss -tunlp | grep 端口号 #示例…

苍穹外卖第一天

角色分工 技术选型 pojo子模块 nginx反向代理 MD5密码加密

IP服务模型

1. IP数据报 IP数据报中除了包含需要传输的数据外&#xff0c;还包括目标终端的IP地址和发送终端的IP地址。 数据报通过网络从一台路由器跳到另一台路由器&#xff0c;一路从IP源地址传递到IP目标地址。每个路由器都包含一个转发表&#xff0c;该表告诉它在匹配到特定目标地址…

Kafka下载

一、Kafka下载 下载地址&#xff1a;https://kafka.apache.org/downloads 二、Kafka安装 因为选择下载的是 .zip 文件&#xff0c;直接跳过安装&#xff0c;一步到位。 选择在任一磁盘创建空文件夹&#xff08;不要使用中文路径&#xff09;&#xff0c;解压之后把文件夹内容…