【算法】滑动窗口题单——3.不定长滑动窗口(求最短/最小)⭐ 删除最短的子数组使剩余数组有序

文章目录

  • 209. 长度最小的子数组
    • O(n)滑动窗口
    • O(nlogn) 前缀和+二分查找
  • 1234. 替换子串得到平衡字符串
  • 1574. 删除最短的子数组使剩余数组有序⭐
    • 枚举左端点,移动右端点
    • 枚举右端点,移动左端点
  • 76. 最小覆盖子串

题单来源:https://leetcode.cn/problems/minimum-size-subarray-in-infinite-array/solutions/2464878/hua-dong-chuang-kou-on-shi-jian-o1-kong-cqawc/

209. 长度最小的子数组

https://leetcode.cn/problems/minimum-size-subarray-sum/description/

在这里插入图片描述

提示:

1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5

进阶:

如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

O(n)滑动窗口

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length, ans = n + 1, s = 0;
        for (int l = 0, r = 0; r < n; ++r) {
            s += nums[r];
            while (s - nums[l] >= target) s -= nums[l++];
            if (s >= target) ans = Math.min(ans, r - l + 1);
        }
        return ans == n + 1? 0: ans;
    }
}

O(nlogn) 前缀和+二分查找

枚举左端点,二分查找右端点。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length, ans = n + 1;
        int[] s = new int[n + 1];
        for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + nums[i - 1];
        for (int i = 0; i < n; ++i) {
            int l = i, r = n, t = target + s[i];
            while (l < r) {
                int mid = l + r >> 1;
                if (s[mid] >= t) r = mid;
                else l = mid + 1;
            }
            if (s[l] >= t) ans = Math.min(ans, l - i);
        }
        return ans == n + 1? 0: ans;
    }
}

1234. 替换子串得到平衡字符串

https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/

在这里插入图片描述

提示:

1 <= s.length <= 10^5
s.length 是 4 的倍数
s 中只含有 'Q', 'W', 'E', 'R' 四种字符

需要满足的条件是窗口外的各个元素的数量都<=n/4,这样就可以完成替换。

class Solution {
    public int balancedString(String s) {
        int n = s.length(), ans = n;
        int[] cnt = new int[128];
        for (char ch: s.toCharArray()) cnt[ch]++;
        for (int l = 0, r = 0; l < n; ++l) {
            while (!check(cnt, n / 4) && r < n) --cnt[s.charAt(r++)];
            if (check(cnt, n / 4)) ans = Math.min(ans, r - l);
            ++cnt[s.charAt(l)];
        }
        return ans;
    }

    public boolean check(int[] cnt, int x) {
        return cnt['Q'] <= x && cnt['W'] <= x && cnt['E'] <= x && cnt['R'] <= x;
    }
}

1574. 删除最短的子数组使剩余数组有序⭐

https://leetcode.cn/problems/shortest-subarray-to-be-removed-to-make-array-sorted/description/

在这里插入图片描述

提示:

1 <= arr.length <= 10^5
0 <= arr[i] <= 10^9

定义好 l 和 r 的含义,分别是第一个非递减子数组的结束位置和第二个非递减子数组的开始位置,而不是中间被删除的子数组的两端。

枚举左端点,移动右端点

class Solution {
    public int findLengthOfShortestSubarray(int[] arr) {
        int n = arr.length, r = n - 1;      // r表示下一个非递减数组的开始位置
        while (r > 0 && arr[r - 1] <= arr[r]) r--;
        if (r == 0) return 0;
        int ans = r;
        // l表示第一个非递减数组的结束位置
        for (int l = 0; l == 0 || arr[l - 1] <= arr[l]; ++l) {
            while (r < n && arr[r] < arr[l]) ++r;
            ans = Math.min(ans, r - l - 1);
        }
        return ans;
    }
}

枚举右端点,移动左端点

class Solution {
    public int findLengthOfShortestSubarray(int[] arr) {
        int n = arr.length, l = 0;      // l表示第一个非递减数组的结束位置
        while (l + 1 < n && arr[l + 1] >= arr[l]) l++;
        if (l == n - 1) return 0;
        int ans = n - l - 1;
        // r表示下一个非递减数组的开始位置
        for (int r = n - 1; r == n - 1 || arr[r] <= arr[r + 1]; --r) {
            while (l >= 0 && arr[l] > arr[r]) l--;
            ans = Math.min(ans, r - l - 1);
        }
        return ans;
    }
}

76. 最小覆盖子串

https://leetcode.cn/problems/minimum-window-substring/description/

在这里插入图片描述

提示:

m == s.length
n == t.length
1 <= m, n <= 10^5
s 和 t 由英文字母组成

进阶:你能设计一个在 o(m+n) 时间内解决此问题的算法吗?

维护窗口中的字符出现数量。
枚举右端点,根据条件收缩左端点即可。

class Solution {
    int[] cnt1 = new int[128], cnt2 = new int[128];

    public String minWindow(String s, String t) {
        for (char ch: t.toCharArray()) cnt2[ch]++;
        String ans = "";
        int mnL = s.length() + 1;
        for (int l = 0, r = 0; r < s.length(); ++r) {
            cnt1[s.charAt(r)]++;
            while (l < r && cnt1[s.charAt(l)] > cnt2[s.charAt(l)]) cnt1[s.charAt(l++)]--;
            if (check() && mnL > r - l + 1) {
                mnL = r - l + 1;
                ans = s.substring(l, r + 1);
            }
        }
        return ans;
    }

    public boolean check() {
        for (int i = 0; i < 128; ++i) {
            if (cnt1[i] < cnt2[i]) return false;
        }
        return true;
    }
}

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

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

相关文章

计算机网络-应用层(2)

一、DHCP 当需要跨越多个网段提供DHCP 服务时必须使用DHCP 中继代理&#xff0c; 就是在DHCP 客户和服务器之间转发DHCP 消息的主机或路由器。 DHCP 服务端使用UDP 的67号端口来监听和接收客户请求消息&#xff0c; 保留UDP 的68号端口用于接收来自DHCP 服务器的消息回复。 在…

linux上java -jar方式运行项目及输出文件nohup.out的清理, linux上定时器的用法

linux上java -jar方式运行项目及输出文件nohup.out的清理&#xff0c; linux上定时器的用法 linux上java -jar方式运行定期自动清理nohup.out文件的内容**验证**定时器crontab使用时注意事项 linux上java -jar方式运行 参考&#xff1a;https://blog.csdn.net/qq_42169450/arti…

UVa140 Bandwidth(带宽)

1、题目 2、题意 给出一个 n &#xff08; n ≤ 8 &#xff09; n&#xff08;n≤8&#xff09; n&#xff08;n≤8&#xff09;个结点的图G和一个结点的排列&#xff0c;定义结点 i i i 的带宽 b ( i ) b(i) b(i) 为 i i i 和相邻结点在排列中的最远距离&#xff0c;而所…

nodejs+vue旅游推荐系统-计算机毕业设计

本文首先介绍了旅游推荐系统的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;根据需求分析制定模块并设计数据库结构&#xff0c;再根据系统总体功能模块的设计绘制系统的功能模块图&#xff0c;流程图…

3.加载天地图

愿你出走半生,归来仍是少年&#xff01; 上一篇文章构建出来基础的白球&#xff0c;现在需要给它添加底图啦。先上最常用的天地图。 1.天地图 天地图做过Gis开发的应该都知道&#xff0c;需要先申请key然后才能使用。然后天地图是基于XYZ的标准进行切片的&#xff0c;所以直接…

Web:探索 SpreadJS强大的在线电子表格库

1、概述 SpreadJS 是葡萄城结合 40 余年专业控件技术和在电子表格应用领域的经验而推出的纯前端表格控件,基于 HTML5,兼容 450 多种 Excel 公式,具备“高性能、跨平台、与 Excel 高度兼容”的产品特性,SpreadJS 在界面和功能上与 Excel 高度类似,但又不局限于 Excel,而是…

基于华为云 IoT 物联网平台实现家居环境实时监控

01 智能家居环境监测 智能家居环境监测采用 Ruff 开发板作为主控&#xff0c;串口线连接温湿度传感器 DHT11 和空气质量传感器 SDS011&#xff0c;每5分钟采集一次数据&#xff0c;通过 MQTT 协议发送到华为云 IoT 物联网平台&#xff0c;并基于数据分析服务实时计算出整个家庭…

Pytorch实现深度学习常见问题

RuntimeError: stack expects each tensor to be equal size, but got [3, 300, 300] at entry 0 and [3, 301, 301] at entry 24 这里的问题出现的原因肯定是在数据预处理处&#xff0c;如下图&#xff0c;当数据使用不同的transforms处理方式时&#xff0c;会导致数据的尺寸大…

[17]JAVAEE-HTTP协议

目录 一、什么是HTTP协议 什么时候会用到HTTP协议&#xff1f; HTTP协议的工作流程 二、HTTP的报文格式 抓包 HTTP请求报文格式 1.首行 2.header 常见键值对&#xff1a; 3.空行 4.正文&#xff08;body&#xff09;&#xff08;有的时候可以没有&#xff09; HTTP…

AcWing 1.2.1 最长上升子序列模型 + 动态规划 + 图解(详细)

&#xff08;1&#xff09;acwing 4557. 最长上升子序列 4557. 最长上升子序列 - AcWing题库 给定一个长度为 N 的整数序列 a1,a2,…,aN。请你计算该序列的最长上升子序列的长度。上升子序列是指数值严格单调递增的子序列 输入格式 第一行包含整数 N第二行包含 N个整数 a1,a…

TEMU电器等产品要求提供CE-LVD,不接受CE-EMC

最近&#xff0c;TEMU平台对CE资质要求越来越严格&#xff0c;针对CE资质又提出了两点新要求。首先&#xff0c;TEMU平台要求提供正式的CE证书&#xff0c;且必须有签发实验室的盖章或者签字。这一要求是为了确保产品符合欧洲市场的安全标准&#xff0c;也是为了保护消费者的利…

Tomcat的动静分离

一、动态负载均衡 3、台虚拟机模拟&#xff1a; 代理服务器&#xff1a;51 tomcat动态页面&#xff1a;53,54 关闭防火墙和安全机制 配置代理服务器&#xff0c;由于做的是七层代理&#xff0c;所以要在http模块配置 配置前端页面 <!DOCTYPE html> <html> <…

解决node项目一个极度困难的捕获异常却无法读取异常信息的问题

这个项目是集成了第三方NeteaseCloudMusicApi项目的接口代码&#xff0c;我没有直接使用它的接口&#xff0c;因为需要再跑一个npm run开个端口&#xff0c;感觉很麻烦。 所以下定决心&#xff0c;使用拆分代码的方式&#xff0c;硬生生将这个api项目的部分api接口代码集成到了…

构造类型详解及热门题型结构体大小的计算

在编写程序时&#xff0c;简单的变量类型已经不能满足程序中各种复杂数据的需求&#xff0c;因此c语言还提供了构造类型的数据&#xff0c;构造数据是有基本数据按照一定的规则组成的。 目录 结构体类型的概念 结构体变量的定义 结构体变量的初始化 结构体变量的引用 结构…

软件工程——期末复习知识点汇总

本帖的资料来源于某国内顶流高校的期末考试资料&#xff0c;仅包含核心的简答题&#xff0c;大家结合个人情况&#xff0c;按需复习~ 总的来说&#xff0c;大层面重点包括如下几个方面&#xff1a; 软件过程需求工程 设计工程软件测试软件项目管理软件过程管理 1.掌握软件生命…

flutter 使用FlutterJsonBeanFactory工具遇到的问题

如下图&#xff0c;使用FlutterJsonBeanFactory工具生成的数据类 但是其中 生成的 import package:null/&#xff0c;导致的错误&#xff1a;Target of URI doesn’t exist: ‘package:null/generated/json/asd.g.dart’ 尝试过的方法&#xff1a; 手动添加包名&#xff0c;…

Map集合 遍历:lambda方式

package day01;import java.util.*;public class Mapday1 {public static void main(String[] args) {/* HashMap 无序 不重复&#xff0c;会覆盖前面 无索引*/System.out.println("--------------------");Map<String, Integer> map new HashMap<>();m…

Kafka - 消息队列的两种模式

文章目录 消息队列的两种模式点对点模式&#xff08;Point-to-Point&#xff0c;P2P&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff0c;Pub/Sub&#xff09; 小结 消息队列的两种模式 消息队列确实可以根据消息传递的模式分为 点对点模式发布/订阅模式 这两…

Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能

CameraX是JetPack库之一&#xff0c;通过CameraX可以向应用增加相机的功能。在下列内容中&#xff0c;将介绍一个结合CameraX实现一个简单的拍照应用。本应用必须采用Android SDK 34。并通过该简单示例&#xff0c;了解传统View层次组件的UI组件如何与Compose组件结合实现移动应…

【代码思路】2023mathorcup 大数据数学建模B题 电商零售商家需求预测及库存优化问题

各位同学们好&#xff0c;我们之前已经发布了第一问的思路视频&#xff0c;然后我们现在会详细的进行代码和结果的一个讲解&#xff0c;然后同时我们之后还会录制其他小问更详细的思路以及代码的手把手教学。 大家我们先看一下代码这一部分&#xff0c;我们采用的软件是Jupyte…