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

news2024/9/25 15:25:54

文章目录

  • 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;
    }
}

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

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

相关文章

SpringBoot | SpringBoot中实现“微信支付“

SpringBoot中实现"微信支付": 1.“微信支付”产品2."微信支付"接入流程3.“微信小程序支付”时序图&#xff1a;3.1 “商家端JSAPI下单” 接口3.2 “微信小程序端调起支付” 接口 4.微信支付准备工作&#xff1a;4.1 获得微信支付平台证书、商户私钥文件4…

博通BCM575系列 RDMA 网卡驱动 bnxt_re 分析(一)

简介 整个BCM系列驱动分成以太网部分(bnxt_en.ko)和RDMA部分(bnxt_re.ko), 两个模块之间通过内核的auxiliary_bus进行管理.我们主要分析下bnxt_re驱动. 代码结构 这个驱动的核心是 qplib_fp.c, 这个文件主要包含了驱动的数据路径, 包括Post Send, Post Recv, Poll CQ流程的实…

读C++ Primer有感

文章目录 类型转换&#xff1a;强制类型转换 标准库类型vector迭代器&#xff1a;数组数组形参可变形参的函数迭代器失效问题IO泛型算法 类型转换&#xff1a; ​ 无符号(0-255) ​ 当赋给一个超出表示范围之后&#xff0c;初始值对无符号类型表示数值总数取模后的余数 ​ un…

[精选好文] ElasticSearch入门到实战教程

给大家分享一个比较好的ElasticSearch教程&#xff0c;ES常用的语法&#xff0c;API都有总结&#xff0c;大家工作时候可以直接翻开用。 地址&#xff1a;点击查看

学习笔记:并查集

并查集 并查集被很多 OIer \texttt{OIer} OIer 认为是最简洁而优雅的数据结构之一&#xff0c;主要用于解决一些 元素分组 的问题。它管理一系列 不相交的集合&#xff0c;并支持两种操作&#xff1a; 合并&#xff1a;把两个不相交的集合合并为一个集合。查询&#xff1a;查…

Windows VS C++工程:包含目录、库目录、附加依赖项、附加包含目录、附加库目录配置与静态库、动态库的调用

文章目录 1 包含目录/附加包含目录1.1 区别和作用1.2 设置路径 2 库目录/ 附加库目录2.1 用途2.2 设置路径 3 附加依赖项3.1 用途3.2 设置路径 4 注意运行库的设置4 静态链接库调用方法5 动态链接库的调用方法 利用Visual Studio编写C工程文件时&#xff0c;时常需要自行配置自…

SQL中:语法总结(group by,having ,distinct,top,order by,like等等)

语法总结&#xff1a;group by&#xff0c;distinct ...... 1.group by2.聚集函数count 3.order by4.增insert、删&#xff08;drop、delete&#xff09;、改&#xff08;update、alter&#xff09;5.查select嵌套查询不相关子查询相关子查询使用的谓词使用的谓词子查询的相关谓…

大厂面试题-JVM中的三色标记法是什么?

目录 问题分析 问题答案 问题分析 三色标记法是Java虚拟机(JVM)中垃圾回收算法的一种&#xff0c;主要用来标记内存中存活和需要回收的对象。 它的好处是&#xff0c;可以让JVM不发生或仅短时间发生STW(Stop The World)&#xff0c;从而达到清除JVM内存垃圾的目的&#xff…

蓝桥杯每日一题2023.10.27

题目描述 快速排序 - 蓝桥云课 (lanqiao.cn) #include <stdio.h>int quick_select(int a[], int l, int r, int k) {int p rand() % (r - l 1) l;int x a[p];{int t a[p]; a[p] a[r]; a[r] t;}int i l, j r;while(i < j) {while(i < j && a[i] &…

centos 8 yum源不能使用问题

问题&#xff1a;新安装的centos 8 不能使用wget就不能下载和安装其他的软件 错误&#xff1a;为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 解决&#xff1a; [rootlocalhost ~]# cd /etc/yum.repos.d [rootlocalhost yu…

栈、队列、矩阵的总结

栈的应用 括号匹配 表达式求值&#xff08;中缀&#xff0c;后缀&#xff09; 中缀转后缀&#xff08;机算&#xff09; 中缀机算 后缀机算 总结 特殊矩阵 对称矩阵的压缩存储 三角矩阵 三对角矩阵 稀疏矩阵的压缩存储

windows服务器环境下使用php调用com组件

Office设置 安装 office2013 且通过正版激活码激活 在组件服务 计算机 我的电脑 DOM 中找到 Microsoft Word 97 - 2003 文档 服务&#xff0c;右键属性 身份验证调整为 无 在 标识中 调整为 交互式用户 php环境设置 开启com组件扩展 在php.ini中设置 extensionphp_com_dotn…

关于亚马逊 CodeWhisperer 的测试反馈

CodeWhisperer 是亚马逊推出的实时 AI 编程助手&#xff0c;是一项基于机器学习的服务&#xff0c;它可以分析开发者在集成开发环境&#xff08;IDE&#xff09;中的注释和代码&#xff0c;并根据其内容生成多种代码建议。 亚马逊云科技开发者社区为开发者们提供全球的开发技术…

python---continue关键字对for...else结构的影响

代码&#xff1a; str1 laowang for i in str1:if i w:print(遇w不打印)continueprint(i) else:print(循环正常结束之后执行的代码) 图示&#xff1a;

速卖通商品详情API接口(标题|主图|SKU|价格|商品描述)

速卖通商品详情接口的用途是获取商品信息。 速卖通商品详情接口可以获取到商品的完整详细信息&#xff0c;包括商品名称、价格、图片、描述、规格、库存等&#xff0c;这些信息能够帮助用户了解商品特点、性能和市场定位&#xff0c;并做出购买决策。同时&#xff0c;通过使用…

0基础学习VR全景平台篇第114篇:全景图优化和输出 - PTGui Pro教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 前情回顾&#xff1a;之前&#xff0c;我们详细介绍了如何用编辑器、控制点、垂直线等功能优化错位和矫正水平&#xff0c;然而这些调整不会马上生效。 我们需要在【优化】选项卡…

react-native调试

一、调试页面js代码 我用的真机调试&#xff0c;手机摇晃会出现出现的页面&#xff0c;点击debug 点击debug后&#xff0c;页面会出现&#xff0c;点按提示操作快捷键会出现开发者工具 注意&#xff1a;Chrome 中并不能直接看到 App 的用户界面&#xff0c;而只能提供 consol…

百度超级链XuperChain使用JavaSDK接入

环境 &#xff1a; ubuntu20 xuperchain 5.3 go 1.17 springboot : 2.5.14 前言 请提前启动好xchain的节点&#xff0c;我选择简单启一个xchain节点作为测试&#xff0c;并且使用默认端口37101 SpringBoot项目初始化 我们先进行SpringBoot项目的配置进行讲解&#xff0c;这里…

安卓逆向之雷电模拟器中控

一, 雷电模拟器 安装使用 官方地址: https://www.ldmnq.com ,官方论坛 https://www.ldmnq.com/forum/ . 有一个多开管理器,还有就是设置手机的参数比较关键。 二,雷电模拟器开启面具,安装LSP。 设置root 权限。

搜索引擎搜索技巧总结

晚上在B站上刷到一个关于搜索技巧的干货视频&#xff0c;这个视频真的不错&#xff0c;结尾还提到了AI时代的搜索思路之前自己也零碎的探索出了一些搜索技巧&#xff0c;但是没有总结&#xff0c;就没法稳定的加入自己的工作流&#xff0c;持续提高效率受到这个视频的启发&…