双指针之滑动窗口(长度最小的子数组 和 和为s的连续正数序列)
双指针之滑动窗口 (长度最小的子数组;和为s的连续正数序列)
1, 什么时候使用? (与子数组/字符串 有关的题目)~如果给了某个具体值的target,即用滑动窗口 不然就双指针(一般做法,左边< 右边,依据条件左边和右边都不断靠近) |
滑动窗口:是双指针的题目
找出一个数组中满足一定条件的子数组问题,字符串也可以看成数组。看到子数组问题,就是DP回溯滑动窗口这三种之一
2,滑动窗口的通用框架 1:(例题:209_长度最小的子数组)
(做题特点一:题目给定了具体的值target,这个target条件的可能弹性空间比较大了
【例如题目 要求某种情况下>= target】,而大于target的可能情况就会比较多了
* ① 先移动右指针确定窗口的大致可能范围(在这大致可能范围里找到最优范围),然后暂时固定住右指针,
* ② 在满足条件(满足target下):不断的移动左指针,缩小窗口
* ③ 当不满足target了,又开始移动右指针,然后。。。。。又确定下来窗口的大致可能范围
(在这大致可能范围里找到最优范围),然后暂时固定住右指针。。。
* 特点2,形式上的特点(左右指针移动的方向):是一开始左右指针,同方法移动)
public class 滑动窗口的通用框架 1{
public String slidingWindow(String s, String t) {
// 起始的时候,都位于 0,同方向移动
int left = 0;
int right = 0;
int sLen = s.length();
while (right < sLen) {
char c = s.charAt(right);
right++;
//对状态做修改
while ( 满足某种条件 ) {
//更新ans可能的地方之一
char c1 = s.charAt(left);
left++;
//对状态做修改
}
//更新ans可能的地方之二
}
return 需要的结果变量;
}
}
例题:
package 数组;
/**
* https://leetcode-cn.com/problems/minimum-size-subarray-sum/
* @author Huangyujun
*
* 注意细节:当找到满足条件的窗口时,需要固定右边界,
* 逐渐移动左边界(缩小窗口大小),直到窗口元素和不满足要求,再改变右边界。使用while循环缩小!
*
*/
public class _209_长度最小的子数组 {
public int minSubArrayLen(int s, int[] nums) {
int n = nums.length;
if (nums == null || n == 0) return 0;
int ans = Integer.MAX_VALUE;
int left = 0, right = 0;
int sum = 0;
while (right < n) {
sum += nums[right++];
while (sum >= s) {
ans = Math.min(ans, right - left);
sum -= nums[left++];
}
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
}
3,滑动窗口的通用框架 2:(例题:57_和为s的连续正数序列)
做题特点 一:题目给定了具体的值target,这个target条件的可能弹性空间唯一了
【例如题目 要求某种情况下= target】,而等于target的可能情况在“暂时固定下的范围窗口中情况就是固定下该窗口呀”
* ① == target,这种直接通过判断找窗口范围,找到一个固定窗口范围后,移动左边指针(达到整体窗口向前移动)去找下一个固定窗口范围
* 这类题:直接分:①== target,② < target ,③ > target 来找合适的固定窗口范围
public class 滑动窗口的通用框架 2{
public String slidingWindow(int target) {
// 起始的时候,同方向移动
int left = 1;
int right = 2;
while (l < r) {
更新ans
if( ans == target){
//需要的结果,得到了一个
l++;
}else if(ans < target){ //比target小,右指针往前移动,扩大范围
r++;
}else{ //比target大,左指针往前移动,缩小范围
l++;
} }
return 需要的结果变量;
}
}
例题:
package 数组; /**
* https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/
*/
import java.util.ArrayList;
import java.util.List; public class _57_和为s的连续正数序列 {
/**
* 细节:正数 思路: 1、双指针技术,就是相当于有一个窗口,窗口的左右两边就是两个指针 2、根据窗口内值之和来确定窗口的位置和宽度。
*/
public int[][] findContinuousSequence(int target) {
List<int[]> vec = new ArrayList<int[]>();
int l = 1, r = 2;
while(l < r) {
//求和公式
int sum = (l + r) * (r - l + 1) / 2;
if (sum == target) {
int[] res = new int[r - l + 1];
for (int i = l; i <= r; ++i) {
res[i - l] = i;
}
vec.add(res);
l++; //找到之后,左边指针往前挪动,意味着整个窗口往前挪动
} else if (sum < target) {
r++;
} else {
l++;
}
}
return vec.toArray(new int[vec.size()][]);
} }
双指针之滑动窗口(长度最小的子数组 和 和为s的连续正数序列)的更多相关文章
- [Swift]LeetCode209. 长度最小的子数组 | Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- 209. 长度最小的子数组--LeetCode
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/minimum-size-subarray-sum 著作权归领扣网络所有.商业转载请联系官方授权,非商业 ...
- LC算法技巧总结(二):双指针和滑动窗口技巧
我把双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」.前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环:后者主要解决数组(或者字符串)中的问题,比如二分查找. 一.快慢指针的常 ...
- Java实现 LeetCode 532 数组中的K-diff数对(双指针,滑动窗口)
532. 数组中的K-diff数对 给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数 ...
- 滑动窗口解决最小子串问题 leetcode3. Longest Substring Without Repeating Characters
问题描述: Given a string, find the length of the longest substring without repeating characters. Example ...
- 剑指 Offer 57 - II. 和为s的连续正数序列 + 双指针 + 数论
剑指 Offer 57 - II. 和为s的连续正数序列 Offer_57_2 题目描述 方法一:暴力枚举 package com.walegarrett.offer; /** * @Author W ...
- 【LeetCode】209. 长度最小的子数组
209. 长度最小的子数组 知识点:数组:前缀和:二分法:双指针:滑动窗口 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小 ...
- leetcode全部滑动窗口题目总结C++写法(完结)
3. 无重复字符的最长子串 A: 要找最长的无重复子串,所以用一个map保存出现过的字符,并且维持一个窗口,用le和ri指针标识.ri为当前要遍历的字符,如果ri字符在map中出现过,那么将le字符从 ...
- Java实现 LeetCode 209 长度最小的子数组
209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = ...
随机推荐
- 详解 Interpolator动画插值器
Interpolator 被用来修饰动画效果,定义动画的变化率.在Android源码中对应的接口类为TimeInterpolator,通过输入均匀变化的0~1之间的值,可以得到匀速.正加速.负加速.无 ...
- MMM双主-双从读写分离部署
原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 前期规划 1.1 主机规划 1.2 虚拟IP规划 1.3 用户列表 1.4 整 ...
- Java如何搭建脚手架(自动生成通用代码),创建自定义的archetype(项目模板)
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Python之smtplib模块
工作中难免会出现自动发送电子邮件的需求,比如说做完自动化测试之后通过电子邮件的形式将结果反馈出来.Python中提供了标准库smtplib来解决这一问题,该模块定义了一个smtp客户端会话对象,能够将 ...
- javaScript知识储备
javaScript知识储备 组成 ECMAScript(核心) 提供语法.变量等,遵循ECMA-262标准 DOM(文档对象模型) 提供操作HTML标签的API,遵循W3C规范 BOM(浏览器对象模 ...
- 安装和配置CloudWatchAgent
文章原文 使用 CloudWatch 代理收集指标和日志 下载 CloudWatch 代理软件包 sudo yum install amazon-cloudwatch-agent 点击查看其他平台软件 ...
- Vs code添加自定义snippet
Vs code添加自定义snippet(代码段) 前言 代码段能够帮助输入重复代码模式,在智能感知下可以帮我们快速补全代码,节省时间方便之余更利于代码格式的统一规范化. 1. Vs code代码段 ...
- VUE003. 解决data中使用vue-i18n不更新视图问题(computed属性)
案例 在国际化开发中,有一部分需要国际化的文字是由数据驱动的储存在data中,然而VUE的data存在很多无法实时更新视图的问题,比如v-for循环的标签,当数据层次过深,通过源数据数组的索引改变它的 ...
- SpringSecurity-图解
- 使用Redis实现分布式会话
1. 概述 传统的单体应用中,用户是否登录,通常是通过从Tomcat容器的session中获取登录用户信息判断的. 但在分布式的应用中,通常负载均衡了多台Tomcat,每台Tomcat都有自己独立的s ...