滑动窗口算法用法及实题详解
在力扣常用解题法中,我们常常会看到这些:
- 滑动窗口
- 双指针
- 快慢指针/ 链表题目
- 原地链表翻转
- 区间合并
- 无序限定范围的数组元素查找O(N)
- BFS
- 树的DFS
- DFS/递归/回溯法
- 双堆模式
- 2分变种
- 前K大的数模式HEAP
- K路归并
- DP 动态规划
- 排序算法
- 树和链表结合
- 树的重新构建
- 位运算
- 字符串
- stack
- math
- array
- 二叉搜索树
快慢指针、动态规划、链表、树的遍历,这些已经是烂大街的概念。
而偏偏是最常用的,也排在首位的滑动窗口
算法,却并不为人熟知,什么是滑动窗口算法
呢??
滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。
力扣上最熟悉的题目应该就是两数之和、三数之和,这些题目如果我们要使用暴力解法,一般需要n方甚至是立方的复杂度。而如果采用滑动窗口来解决这些问题,我们就会避免两层三层的循环嵌套,从而在非常大的程度上降低时间复杂度。
滑动窗口的应用场景:如上,我们需要获得数组中、字符串中符合条件的字元素时,我们就可以采用滑动窗口。
简单介绍一下滑动窗口的用法:依次遍历数组,此时的下标即右指针,向后依次挪动。另外,我们会定义一个左指针,当左指针和右指针区间内的元素不符合条件时,我们便会移动左指针,直至条件符合,继续挪动右指针。其间统计每一次的结果。
实际应用举例:
leetcode 1438. 绝对值不超过限制的最长连续子数组
题目描述:
给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
示例 1:
输入:nums = [8,2,4,7], limit = 4
输出:2
解释:所有子数组如下:
[8] 最大绝对差 |8-8| = 0 <= 4.
[8,2] 最大绝对差 |8-2| = 6 > 4.
[8,2,4] 最大绝对差 |8-2| = 6 > 4.
[8,2,4,7] 最大绝对差 |8-2| = 6 > 4.
[2] 最大绝对差 |2-2| = 0 <= 4.
[2,4] 最大绝对差 |2-4| = 2 <= 4.
[2,4,7] 最大绝对差 |2-7| = 5 > 4.
[4] 最大绝对差 |4-4| = 0 <= 4.
[4,7] 最大绝对差 |4-7| = 3 <= 4.
[7] 最大绝对差 |7-7| = 0 <= 4.
因此,满足题意的最长子数组的长度为 2 。
示例 2:
输入:nums = [10,1,2,4,7,2], limit = 5
输出:4
解释:满足题意的最长子数组是 [2,4,7,2],其最大绝对差 |2-7| = 5 <= 5 。
示例 3:
输入:nums = [4,2,2,2,4,4,2,2], limit = 0
输出:3
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
0 <= limit <= 10^9
public class _1438_绝对值不超过限制的最长连续子数组 {/*** 我们可以枚举每一个位置作为右端点,找到其对应的最靠左的左端点,满足区间中最大值与最小值的差不超过 * limit* limit。** 注意到随着右端点向右移动,左端点也将向右移动,于是我们可以使用滑动窗口解决本题。** 为了方便统计当前窗口内的最大值与最小值,我们可以使用平衡树:** 语言自带的红黑树,例如* Java* Java 中的 * TreeMap* 来维护窗口内元素构成的有序集合。** @param nums* @param limit* @return*/public int longestSubarray(int[] nums, int limit) {TreeMap<Integer,Integer> treeMap = new TreeMap<>();int left = 0;int res = 0;int n = nums.length;int right = 0;while (right < n){// 1 1 4 5 1treeMap.put(nums[right], treeMap.getOrDefault(nums[right],0) + 1);while (treeMap.lastKey() - treeMap.firstKey() > limit){treeMap.put(nums[left], treeMap.get(nums[left]) - 1);if (treeMap.get(nums[left]) == 0){treeMap.remove(nums[left]);}left++;}res = Math.max(res, right - left + 1);right++;}return res;}
}
滑动窗口算法用法及实题详解相关推荐
- 列表左右箭头滑动_我写了一套框架,把滑动窗口算法变成了默写题
读完本文,你可以去力扣拿下如下题目: 76.最小覆盖子串 567.字符串的排列 438.找到字符串中所有字母异位词 3.无重复字符的最长子串 ----------- 鉴于前文 二分搜索框架详解 的那首 ...
- 滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)
一.声明 1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**: 2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴: 3.再 ...
- “滑动窗口”算法详解
一.概念 滑动窗口算法是在给定特定窗口大小的数组或字符串上执行要求的操作.该技术可以将一部分问题中的嵌套循环转变为一个单循环,因此它可以减少时间复杂度. 简而言之,滑动窗口算法在一个特定大小的字符串或 ...
- 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...
- 滑动窗口算法通用思想
文章目录 一.最小覆盖子串 二.找到字符串中所有字母异位词 三.无重复字符的最长子串 最后总结 本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道难度较大的子字符串匹配问题: 最小覆盖子串 ...
- 滑动窗口算法_有点难度,几道和「滑动窗口」有关的算法面试题
前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 **滑动窗 ...
- 滑动窗口算法基本原理与实践
原文作者:huansky 原文地址:滑动窗口算法基本原理与实践 目录 滑动窗口算法(Sliding Window Algorithm) 基本示例 滑动窗口法的大体框架 算法实例 1208. 尽可能使字 ...
- 滑动窗口算法精讲(Sliding Window Algorithm)
文章目录 滑动窗口算法精讲(Sliding Window Algorithm) 简介 步骤及算法模板 模板1 模板2 leetcode例题讲解 入门级 209. 长度最小的子数组 思路: 代码实现 2 ...
- JavaScript滑动窗口算法
JavaScript滑动窗口算法 1 思想 2 代码 1 思想 在力扣上刷题时经常可以看到这样的题,求XXX的子串.子数组.子序列等等,这类题一般使用滑动窗口来解决.本篇文章的思路学习了bilibil ...
最新文章
- 2021-2027年中国智能家居设备行业市场前瞻与投资策略规划报告
- 19个超赞的数据科学和机器学习工具,编程小白必看!(附资料)
- 全球三大BCH(比特币现金)城市,有你想去的吗
- 关于Android Studio dependencies 缓存的问题
- Android 源码查看和解析
- CRM_REPORT_RF_AUTH_OBJ_ORD_LP
- Camera Calibration 相机标定:原理简介(三)
- 【学习笔记】应用层——电子邮件、万维网、HTTP协议
- 存储器空间或者桌面堆_向爱因斯坦学习桌面管理之道
- BlackBerry Key2 键盘扩展
- We7从这里开始---认识we7
- 三种最常见的框架解析 | 如何创建JUnit参数化测试
- Python eval()和exec()函数详解
- 如何设计手机端banner图【电商小白】
- 家用计算机按键不灵怎么修,电脑键盘两个ctrl键失灵怎么回事?ctrl键失灵的修复方法...
- 【电力电子】【2015】基于输出总谐波失真的三种逆变器的比较研究
- JavaScript if条件判断语句
- 什么是熄灯数据中心?可能在新应用和边缘采用
- PDF定位关键字/词所在坐标及页码
- WIN10安装CH340驱动出现感叹号的解决办法总结