【LeetCode】十一、滑动窗口:长度最小的子数组 + 定长子串的元音最大数目

文章目录

  • 1、滑动窗口
  • 2、leetcode209:长度最小的子数组
  • 3、leetcode1456:定长子串中元音的最大数目

1、滑动窗口

如下,有一个数组,现三个元素为一组,求最大的和,自然可以while循环实现:i 、i+1、i+2三个相加,while条件是i+2 <= array.length,如此,前几次循环:

1 + 4 + 2
4 + 2 + 3
2 + 3 + 4

每次都有重复元素(前一次循环的后几位元素)被二次计算了,如三个一组时的i+1和i+2

在这里插入图片描述
如果现在不是三个一组,是三百万个一组,则这个重复计算的浪费太大,考虑使用滑动窗口:

在这里插入图片描述
依旧每次让i++前进一位,但结果不再重新累加,而是下一组的和 = 上一组的和 - 上一组的第一个元素 + 新框进来的元素。像窗口向前滑动,每次和上次相比,多了一个新元素,少了最开始的一个旧元素。

滑动窗口的应用场景如:数组中的定长问题,给定一个数组,指定长度K,求最大值或最小值。

2、leetcode209:长度最小的子数组

在这里插入图片描述
这题两个关键点:一是要求子数组是连续的,二是子数组不是定长的,但也可以用滑动窗口。

解决思路:开一个窗口,但这个窗口不是定长的,开始时,窗口左右两边界都为0,右边界右移,找到第一个子数组array,其和 >= s,然后记录长度。去掉array的第一个元素,如果其和仍然>=s,继续记录,接着再继续去掉array的第一个元素,直到不满足 >=s的条件时,窗口向前滑动,直到出现第二个子数组array

public class P209 {

    public static int getMinLength(int[] array, int s) {
        if (null == array || array.length == 0) {
            return 0;
        }
        // 默认值array.length + 1
        int result = array.length + 1;
        // 窗口的起始位置和结束位置
        int start = 0;
        int end = 0;
        // 窗口内元素的和
        int sum = 0;
        while (end < array.length) {
            sum = sum + array[end];
            // 找到了满足条件的子数组
            while (sum >= s) {
                // 窗口长度end - start + 1
                result = Math.min(result, end - start + 1);
                // 去掉窗口起始位置的元素
                sum = sum - array[start];
                // 窗口起始位置右移一位,看这个子数组能不能再缩减长度,以防出现 {1,1,1,999}这样的情况
                start++;
            }
            // 未找到子数组,或者子数组不能再缩减长度时,窗口结束位置右移一位,继续往下走
            end = end + 1;
        }
        // 如果result还等于默认值array.length + 1,则说明该值一直未被重新赋值,即全部元素加起来也不满足和>=s,返回0
        return result == array.length + 1 ? 0 : result;
    }
}

这题本质在求滑动窗口的最窄长度。

leetcode官方解释:

在这里插入图片描述

3、leetcode1456:定长子串中元音的最大数目

在这里插入图片描述
定长,考虑滑动窗口,先计算第一个k长度的窗口的元音数量,然后一步一步滑动到末尾,期间取Math.max()

public class P1456 {

    public static int getMaxNum(String s, int k) {
        if (null == s || s.length() == 0) {
            return 0;
        }
        HashSet set = new HashSet<String>();
        Collections.addAll(set, "a", "e", "i", "o", "u");
        int result = 0;
        int count = 0;
        String[] array = s.split("");
        // 先算出第一个窗口里元音的数量
        for (int i = 0; i < k; i++) {
            if (set.contains(array[i])) {
                count++;
            }
        }
        result = Math.max(result, count);
        // 窗口滑动
        int start = 0;
        int end = k - 1;
        while (end < array.length - 1) {
            // 滑出窗口的数据如果是元音,数量-1
            if (set.contains(array[start])) {
                count--;
            }
            // 滑进窗口的元素如果是元音,数量+1
            if (set.contains(array[end + 1])) {
                count++;
            }
            result = Math.max(result, count);
            // 本次窗口计算完成,向右滑动一步
            start++;
            end++;

        }
        return result;
    }
}

上面用了HashSet判断是否属于元音,也可用一下两种方法:

//纯方法
public int isVowel(char ch) {
    return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ? 1 : 0;
}

//String对象的indexOf方法
String vowel = "aeiou";
vowel.indexOf('a');  //true

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

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

相关文章

着色器预热?为什么 Flutter 需要?为什么原生 App 不需要?那 Compose 呢?Impeller 呢?

依旧是来自网友的问题&#xff0c;这个问题在一定程度上还是很意思的&#xff0c;因为大家可能会想&#xff0c;Flutter 使用 skia&#xff0c;原生 App 是用 skia &#xff0c;那为什么在 Flutter 上会有着色器预热&#xff08;Shader Warmup&#xff09;这样的说法&#xff1…

使用getline()从文件中读取一行字符串

我们知道&#xff0c;getline() 方法定义在 istream 类中&#xff0c;而 fstream 和 ifstream 类继承自 istream 类&#xff0c;因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时&#xff0c;该方法的功能就变成了从指定文件…

lnternet 发展史

一&#xff0c;lnternet 发展史 ARPA net &#xff08;上世纪50年代二战结束&#xff09; 无线 战场指挥通信协议落后 TCP/IP 包交换 WEB (70年代 ) 80年代 90年代 二&#xff0c;互联网的典型应用&#xff1a; 96年到2008年 第一代技术…

8.ApplicationContext常见实现

ClassPathXmlApplicationContext 基于classpath下xml格式的配置文件来创建 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

Linux-页表如何对物理内存进行映射

1.1 页框和页帧 我们知道通过页表可以将虚拟内存映射到对应的物理内存&#xff0c;而操作系统对于物理内存的管理并不是以字节为单位的&#xff0c;而是将物理内存分为许多大小为4KB的块&#xff0c;称为页框或页帧&#xff0c;这就是为什么我们在创建共享内存是建议将大小设定…

【server】3、注册中心与配置中心

1、服务注册与发现 1.1、consul 1.1.1 是什么 官网&#xff1a; Consul by HashiCorp spring-cloud-consul: Spring Cloud Consul :: Spring Cloud Consul gitHub 官网 &#xff1a;GitHub - hashicorp/consul: Consul is a distributed, highly available, and data cent…

上海-灵曼科技(面经)

上海-灵曼科技 hr电话面 个人简介 个人信息的询问 是否知道芋道框架 技术面 算法题 14. 最长公共前缀&#xff08;写出来即可&#xff09; 聊一下Docker Docker核心概念总结Docker实战 聊一下AOP Spring AOP详解 聊一下JWT JWT 基础概念详解JWT 身份认证优缺点分析 Spri…

2024华为OD机试真题- 电脑病毒感染-(C++/Python)-C卷D卷-200分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用 t 表示。 其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果…

Spzhi知识付费社区主题免费下载

主题介绍 用typecho打造一款知识付费社区主题&#xff0c;带会员功能&#xff0c;为内容创业者提供知识变现一站式解决方案&#xff0c;让用户沉淀到自己的平台&#xff0c;形成自己的私域流量池&#xff0c;打造流量闭环&#xff0c;零门槛搭建你的移动网络课堂 主题功能 支…

RpcChannel的调用过程

目录 1. RPC调用方&#xff08;caller&#xff09;的调用(消费)过程 2.在caller下创建文件&#xff1a;calluserservice.cc 3.在src的include下创建文件&#xff1a;mprpcchannel.h 4.在src下创建mprpcchannel.cc 1. RPC调用方&#xff08;caller&#xff09;的调用(消费)过…

Python:Python基础知识(注释、命名、数据类型、运算符)

四、Python基础知识&#xff08;注释、命名、数据类型、运算符&#xff09; 1.注释 Python有两种注释方法&#xff1a;单行注释和多行注释。单行注释以#开头&#xff0c;多行注释以‘’‘开头和结尾。 2.命名规则 命名规则: 大小写字母、数字、下划线和汉字等字符及组合&am…

Three.js机器人与星系动态场景(三):如何实现动画

在前面的博客中分别介绍了如何快速搭建3D交互场景以及通过坐标辅助工具加深对坐标系的理解。本文将继续探讨其中动画实现的细节。通过调整rotation加深对动画的印象。 Three.js机器人与星系动态场景&#xff1a;实现3D渲染与交互式控制-CSDN博客 Three.js机器人与星系动态场景…

如何在操作使用ufw设置防火墙

UFW&#xff08;简单防火墙&#xff09;是用于管理iptables防火墙规则的用户友好型前端。它的主要目标是使iptables的管理更容易。 在学习Linux的时候大家一般都会关心命令&#xff0c;Posix API和桌面等&#xff0c;很少会去了解防护墙。其实除了一些网络安全厂商提供的付费防…

大疆2025校招内推

需要内推码的请留言哦 期待你的加入

【你真的了解double和float吗】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

2024亚洲国际餐饮展览会(北京餐饮展|火锅展|预制菜展会)

2024北京餐饮展会&#xff0c;2024北京食材展会&#xff0c;2024北京火锅展会&#xff0c;2024北京火锅食材展会&#xff0c;2024北京预制菜展会&#xff0c;2024北京预制食材展会&#xff0c; 2024亚洲国际餐饮展览会&#xff08;北京餐饮展|火锅展|预制菜展会&#xff09; …

Linux Rsyslog+LogAnalyzer+MariaDB部署日志服务器

文章目录 Linux RsyslogLogAnalyzerMariaDB部署日志服务器1 环境准备1.1 服务器端安装LAMP环境1.2 服务启动并加入开机启动1.2.1 Apache1.2.2 MariaDB1.2.3 Php 2 Rsyslog服务端安装及配置2.1 安装Rsyslog及Rsyslog连接MySQL的模块2.2 导入rsyslog-mysql数据库文件2.3 查看刚导…

【高校科研前沿】南京地理与湖泊研究所博士后夏凡为第一作者在环境科学与水资源领域Top期刊发文:钙对云南洱海溶解有机质与浮游细菌相互作用的调控作用

文章简介 论文名称&#xff1a;Calcium regulates the interactions between dissolved organic matter and planktonic bacteria in Erhai Lake, Yunnan Province, China 第一作者及单位&#xff1a;夏凡&#xff08;博士后|中国科学院南京地理与湖泊研究所&#xff09; 通讯…

Build a Large Language Model (From Scratch)附录C(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

C++初学者指南-3.自定义类型(第一部分)-类和基本自定义类型

C初学者指南-3.自定义类型(第一部分)-类和基本自定义类型 文章目录 C初学者指南-3.自定义类型(第一部分)-类和基本自定义类型1.类型种类&#xff08;简化&#xff09;2.为什么选择自定义类型&#xff1f;单向计数器提升序列 3.限制成员访问成员函数公共(public) vs. 私有(priva…