滑动窗口1

1. 长度最小的子数组(209)

题目描述:
在这里插入图片描述
算法原理:
这题使用滑动窗口的方法来进行解决,而滑动窗口实际上就是通过定义同向双指针的方式来实现的,两个指针就是窗口的左右边界,然后结合这样的思想来给出这题的解法。
题目给出的是一个正整数的数组,首先定义一对指针left以及right都是从0开始的,然后right开始向右移动(这显然可以通过一层循环实现),这就是nums数组中元素进窗口的过程。当我们窗口中的元素和大于等于target时,此时我们不去加元素进窗口了,此时right不移动,left向右移动,left左边的元素出窗口,一直循环直至窗口内的元素和小于等于target,此时right又开始移动,又开始有新元素进窗口,重复上述过程。因为题目要求返回最短的满足条件的子数组的长度,因此我们在发现满足大于等于target的窗口时要记录此时的长度并不断更新得到最终的结果。
至于为什么这样操作可以得到正确的结果,我们知道这题的暴力解法时通过遍历左右的各种可能,然后对左右的元素累加进行判断是否大于等于target,如果满足就更新最终返回的长度值。然后我们看这里的滑动窗口当我们最初得到满足条件的窗口时,此时有left和right指针,可以看成固定了left,去得到和left搭配的各种区间可能,最初满足条件的就是left和right搭配,如果此时right向右移只会增加满足条件的子数组长度,所以我们直接跳过后面的可能,left和right搭配就是固定left时子数组的最小长度,按照代码逻辑后面就是要进行left+1的操作并将left位置元素出窗口,此时后面的操作也类似于前面,就相当于固定left+1位置元素,然后去找满足条件的最小的子数组长度。综上,实际上滑动窗口也是遍历各种可能,但是它省略掉了一些不需要去进行遍历处理的可能所以提升了效率。
代码如下:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0, n = nums.length, len = Integer.MAX_VALUE;
        for (int left = 0, right = 0; right < n; right++) {
            sum += nums[right]; // 进窗口
            while (sum >= target) {
                len = Math.min(len, right - left + 1); // 更新结果
                sum -= nums[left]; // 出窗口
                left++;
            }
        }

        return len == Integer.MAX_VALUE ? 0 : len;
    }
}

时间复杂度:
这题时间复杂度不需要去看代码,只需要去理解,因为我们使用了同向双指针,所以代码最多也就是2n的级别(n是nums数组的长度),所以时间复杂度为O(N)。
题目链接

2. 无重复字符的最长子串(3)

题目描述:
在这里插入图片描述
算法原理:
这题我们首先来想一下它的暴力解法,就是遍历这个字符串,然后以每一个字符为起点去不断的向右添加字符直至添加的过程中出现重复的字符,此时我们认为起始的字符的指针为left,向右添加字符的指针为right,那么这个过程就是先right一直++,直到出现重复的字符,此时left++并且right回到left的位置重新开始++直至出现重复的字符,我们不难发现这个过程是可以优化的。因为当出现重复字符时我们根本无需将right回到left的位置,我们只需要先判断s[left]的字符是否和s[right]的字符是否相等,如果相等那么将left++,此时left到right又是一个无重复字符的子串,我们就可以更新结果了。这也是一个滑动窗口问题,right++的过程就是进窗口,left–的过程就是出窗口。具体看代码。
代码如下:

class Solution {
    public int lengthOfLongestSubstring(String ss) {
        int n = ss.length();
        char[] s = ss.toCharArray();
        int[] count = new int[128];
        int ret = 0;
        for (int right = 0, left = 0; right < n; right++) {
            count[s[right]]++;
            while (count[s[right]] > 1) {
                count[s[left]]--;
                left++;
            }
            ret = Math.max(ret, right - left + 1);
        }
        return ret;
    }
}

时间复杂度:
别看代码有两层的循环,但是实际上就是一个left以及right指针在s上的从左到右的移动,因此时间复杂度为O(N)。
题目链接

3. 最大连续1的个数 III(1004)

题目描述:
在这里插入图片描述
算法原理:
根据题目意思我们可以转换为去得到一个最长的子数组,要求子数组中的0的个数不能超过k个。这题就可以当作一个滑动窗口的问题来进行解决。
和前面类似,就是定义两个指针left以及right,right不断++直至0的个数超过k,如果是暴力解法那么将left++之后再将right回到left的位置。我们滑动窗口方法就是基于暴力解法来进行优化,当right++的过程是进窗口,当0的个数超过k,此时判断nums[lett]是否等于0,如果不等于0直接left++,这就是出窗口,如果等于0,那么也是left++(出窗口),但是此时left到right区间内0的数目就减掉一个了,因此left到right区间又是满足条件了,可以更新返回的结果,并且之后right也可以继续移动直至0的个数直至再次大于k,重复上述的过程。具体看代码。
代码如下:

class Solution {
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        int zero = 0; // 0的个数
        int ret = 0; // 返回的最大个数
        for (int right = 0, left = 0; right < n; right++) {
            if (nums[right] == 0) {
                zero++; // 进窗口的同时统计0的个数
            }
            while (zero > k) { // 判断是否达到最大0的个数
                if (nums[left] == 0) {
                    zero--; // 出窗口
                }
                left++;
            }
            ret = Math.max(ret, right - left + 1); // 更新返回值
        }

        return ret;
    }
}

题目链接

4. 将 x 减到 0 的最小操作数(1658)

题目描述:
在这里插入图片描述
算法原理:
根据题意我们知道需要每次都是从左边或者右边删去数字使得删去的数字总和为x,正难则反,我们反着思考,既然这样那么我们可以构建一个中间的子数组,使得这个子数组的总和加起来是等于数组总和减去x的值,这样找出这样中间子数组的长度之后,再将数组总长减去中间数组长度即可。
综上这题又可以转换成一个滑动窗口问题,只需要将中间的子数组或者说是窗口中的和等于数组和sum-x即可。当sum-x<0时直接返回-1,当窗口中的数字和大于sum-x时,此时right停止向右,left中数字出窗口即left++,然后如果此时窗口内的数字和仍然大于sum-x则重复上述过程,如果小于则right继续向右,直至子数组和重新大于,重复上述总体过程。至于更新返回值的时机就是在满足子数组即窗口内的数字和等于sum-x时。
代码如下:

class Solution {
    public int minOperations(int[] nums, int x) {
        int n = nums.length;
        int sum = 0;
        int aim = 0;
        for (int num : nums) {
            sum += num;
        }
        aim = sum - x;
        if (aim < 0) {
            return -1;
        }
        int ret = -1;
        int tmp = 0;
        for (int right = 0, left = 0; right < n; right++) {
            tmp += nums[right];
            while (tmp > aim) {
                tmp -= nums[left];
                left++;
            }
            if (tmp == aim) {
                ret = Math.max(ret, right - left + 1);
            }
        }

        return ret == -1 ? -1 : n - ret;
    }
}

题目链接

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

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

相关文章

华为---配置基本的访问控制列表(ACL)

11、访问控制列表&#xff08;ACL&#xff09; 11.1 配置基本的访问控制列表 11.1.1 原理概述 访问控制列表ACL(Access Control List)是由permit或deny语句组成的一系列有顺序的规则集合&#xff0c;这些规则根据数据包的源地址、目的地址、源端口、目的端口等信息来描述。A…

MySQL数据库简介和安装

文章目录 一、数据库原理目前情况数据库的发展史RDBMS关系型数据库关系型数据库理论 二、MySQL历史发展历程关系型数据库和非关系型数据库 三、安装mysql及优化yum安装编译安装mysql二进制安装优化操作 四、 安装mycli插件客户端工具 一、数据库原理 目前情况 我们正处于一个…

Servlet中请求转发【 Forward】与重定向【Redirection】的区别

在Servlet中&#xff0c;请求转发&#xff08;Request Forwarding&#xff09;和重定向&#xff08;Redirection&#xff09;是用于控制请求流程的两种不同机制。它们的主要区别如下&#xff1a; 一、请求转发 服务器内部操作&#xff1a;转发是在服务器内部进行的操作&#xf…

Datax学习

DataX学习 DataX3.0概览 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。学习可见官网资料(https://github.com/alibaba/DataX)。 设计理念&#…

MySQL之可扩展性(六)

可扩展性 向外扩展 12.重新均衡分片数据 如有必要&#xff0c;可以通过在分片间移动数据来达到负载均衡。举个例子&#xff0c;许多读者可能听一些大型图片分享网站或流行社区网站的开发者提到过用于分片间移动用户数据的工具。在分片间移动数据的好处很明显。例如&#xff…

【JavaScript】流程控制和函数

目录 一、分支语句 1、if语句&#xff1a; 2、switch语句&#xff1a; 二、循环语句 1、while循环语句 2、for循环语句 三、函数声明 1、function 函数名(形参列表){ 函数体 } 2、var 函数名function(形参列表){函数体} 一、分支语句 1、if语句&#xff1a; if(表达式){ }else …

高考志愿不知道怎么填?教你1招,用这款AI工具,立省4位数

高中的岁月&#xff0c;就像一本厚厚的书&#xff0c;我们一页页翻过&#xff0c;现在&#xff0c;终于翻到了最后一页。但这不是结束&#xff0c;这是新的开始&#xff0c;是人生的新篇章。 高考落幕&#xff0c;学子们在短暂的放松后&#xff0c;又迎来了紧张的志愿填报。 “…

达梦数据库的系统视图v$locked_object

达梦数据库的系统视图v$locked_object 在达梦数据库&#xff08;Dameng Database&#xff09;中&#xff0c;V$LOCKED_OBJECT 视图提供了与数据库中被锁定对象相关的信息。这通常用于监控和诊断数据库中的锁定问题&#xff0c;帮助管理员了解哪些对象被锁定了&#xff0c;以及…

如何在Windows 11上设置默认麦克风和相机?这里有详细步骤

如果你的Windows 11计算机上连接了多个麦克风或网络摄像头&#xff0c;并且希望自动使用特定设备&#xff0c;而不必每次都在设置中乱动&#xff0c;则必须将首选设备设置为默认设备。我们将向你展示如何做到这一点。 如何在Windows 11上更改默认麦克风 有两种方法可以将麦克…

工商银行:低息差下的挣扎

时隔四年&#xff0c;市值再度超越贵州茅台成为A股“股王”。 今天要说的就是“宇宙行”——中国工商银行 虽然茅台的信仰开始崩塌&#xff0c;但各大银行股巨头们今年也不好过。2024年一季度六大行业绩集体受挫&#xff0c;息差普遍收窄超过20个基点。其中&#xff0c;包括工…

【Web3】Web3.js 启动!并解决Web3 is not a constructor报错

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 本节教大家如何启动Web3.js 目录 Web3 启动&#xff01; 于是很愉快的报错 创建实例&#xff01; 出来了 Web3&#xff1a;模块…

代码随想录——跳跃游戏Ⅱ(Leetcode 45)

题目链接 贪心 class Solution {public int jump(int[] nums) {if(nums.length 1){return 0;}int count 0;// 当前覆盖最远距离下标int curDistance 0;// 下一步覆盖距离最远下标int nextDistance 0;for(int i 0; i < nums.length; i){nextDistance Math.max(nums[…

指针并不是用来存储数据的,而是用来存储数据在内存中地址(内存操作/函数指针/指针函数)

推荐&#xff1a;1、4、5号书籍 1. 基本概念 首先&#xff0c;让小明了解指针的基本概念&#xff1a; 指针的定义&#xff1a;指针是一个变量&#xff0c;它存储的是另一个变量的地址。指针的声明&#xff1a;例如&#xff0c;int *p表示一个指向整数的指针变量p。 2. 形象…

Mac 微信能上网但浏览器打不开网页

文章目录 推荐 DNSMac 设置 DNS 推荐 DNS 名称首选 DNS备用 DNSGoogle8.8.8.88.8.4.4114 DNS114.114.114.114114.114.115.115阿里223.5.5.5百度180.76.76.76腾讯119.29.29.29电信101.226.4.6联通123.125.81.6移动101.226.4.6铁通101.226.4.68福建电信218.85.152.99218.85.157.…

基于elastic stack的docker-compose部署的ELK与LDAP集成

说明&#xff1a; ldap信息配置到es配置文件上&#xff0c;然后kibana读取es的配置信息 用户与角色的关系通过role_mapping.yml文件配置获取 角色与权限的关系通过elastic stack提供的DevTools或API进行维护 一、前置条件&#xff1a; 1.1 es已开启xpack&#xff08;已开启…

QQ等级评估源码+软件

今天&#xff0c;我将和大家探讨一个与直播、撸礼物相关的主题&#xff0c;它涉及到的是一种特殊的软件及其源码——QQ等级评估工具。在我们的生活中&#xff0c;直播已经成为了一种越来越流行的娱乐方式。不论是音乐会、电子竞技&#xff0c;还是日常生活分享&#xff0c;你都…

猫狗识别—静态图像识别

猫狗识别—静态图像识别 1. 导入必要的库:2. 设置数据目录和模型路径:3. 定义图像转换4. 使用GPU5. 加载没有预训练权重的ResNet模型6. 创建Tkinter窗口:7.定义选择图片的函数:8.定义预测图片的函数:9.退出程序的函数:10.创建按钮:11.运行Tkinter事件循环:12. 完整代码&#xf…

研究发现GPT-4o等较新的多模态AI模型的安全机制有不足之处

在 ChatGPT 和类似的生成式人工智能模型推出后&#xff0c;很多人都在强调安全问题&#xff0c;政府也参与其中&#xff0c;OpenAI 甚至成立了一个超级协调小组&#xff0c;以阻止未来的人工智能失控&#xff0c;但由于对人工智能安全的发展方向存在分歧&#xff0c;该小组于今…

Zed+AD9361项目独立移植到windows中

文件分享 链接&#xff1a;https://pan.baidu.com/s/17wB_9xVWjO7HhxNvmmZyuA 提取码&#xff1a;94zz 首先下载HDL和NO-OS项目 git clone --recursive https://github.com/analogdevicesinc/hdl git clone --recursive https://github.com/analogdevicesinc/no-OS下载…

Grafana+Prometheus构建强大的监控系统-保姆级教程[监控linux、oracle]

什么是Grafana&#xff1f; Grafana是一个开源软件&#xff0c;拥有丰富的指标仪表盘和图形编辑器&#xff0c;适用Prometheus、Graphite、Elasticsearch、OpenTSDB、InfluxDB、redis。。。简单点说就是一套开源WEB可视化平台。通过对数据库数据二次提取&#xff0c;做出好看的…