滑动窗口


  滑动窗口(sliding windows algorithm)这种方法,专门用于解决区间解的问题。它在运算的时候,将解集放在窗口中,结束的时候比对是否符合预期。在运算的过程中,会对窗口的左右边缘进行操作(扩大、缩小)。特别针对于线性输入解决,滑动窗口就很形象了。

30. Substring with Concatenation of All Words

  You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.

  题意是从一串输入字符串s中,找到能全包含words数组的起点(数组元素等长),这个起点可能有多个,而且不需要关心顺序。

Input:
s = "barfoothefoobarman",
words = ["foo","bar"]
Output: [0,9]
Explanation: Substrings starting at index 0 and 9 are "barfoo" and "foobar" respectively.
The output order does not matter, returning [9,0] is fine too.

  比如这个例子,他在第0个位置和第9个位置可以包含words数组,也就是0位置和9位置各有一个长度为6的窗口可以囊括words数组。

Template = "foo","bar"

i=

[b a r] f o o t h e f o o b a r m a n 

[b a r f o o] t h e f o o b a r m a n 

SAVE

b a r f o o[] t h e f o o b a r m a n 

b a r f o o [t h e] f o o b a r m a n 

b a r f o o t h e [f o o] b a r m a n 

b a r f o o t h e [f o o b a r] m a n 

SAVE

b a r f o o t h e f o o b a r[] m a n 

b a r f o o t h e f o o b a r [m a n] 

i=

b [a r f] o o t h e f o o b a r m a n
.... i= b a [r f o] o t h e f o o b a r m a n
....

  每次扩展使用单词列表中的词长,如果扩展过程中不符合预期则清除窗口,窗口左端在当前词总数大于词组总数的时候,计算总数是单词的长度(因为s除以单词长度余数是0到单词长度之间,覆盖了余数就能覆盖整个场景)。

public class FindSubstring {
public void test(){
// [0,9]
String s1 = "barfoothefoobarman";
String[] words1 = {"foo","bar"};
System.out.println(findSubstring(s1,words1));
// []
String s2 = "wordgoodgoodgoodbestword";
String[] words2 = {"word","good","best","word"};
System.out.println(findSubstring(s2,words2));
}
/**
* 单词等长
*/
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> result = new ArrayList<>();
if(s == null || words.length == 0){
return result;
}
int step = words[0].length();
Map<String,Integer> counter = new HashMap<>();
for(String word :words){
counter.merge(word, 1, (a, b) -> a + b);
} for(int i=0;i<step;++i){
Map<String,Integer> window = new HashMap<>();
int left = i;
int right = i;
while (right <= s.length() - step && left <= s.length() - step*words.length){
String sub = s.substring(right,right + step);
window.merge(sub,1,(a , b)->a + b);
if(!counter.containsKey(sub)){
window.clear();
right += step;
left = right;
continue;
}
while (window.get(sub) > counter.get(sub)){
String drop = s.substring(left,left+step);
Integer dec = window.get(drop);
if(dec != null){
if(dec<=1){
window.remove(drop);
}else {
window.put(drop,dec-1);
}
}
left += step;
}
right += step;
if(right - left == step * words.length){
result.add(left);
}
}
}
return result;
} }

76. Minimum Window Substring

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

Example:

Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC" 题意是将s子串中包含T的所有字母的最短子串找出来,例子中BANC是包含ABC的最短子串。
Template = "ABC"

[]A D O B E C O D E B A N C
[A] D O B E C O D E B A N C
[A D] O B E C O D E B A N C
[A D O] B E C O D E B A N C
[A D O B] E C O D E B A N C
[A D O B E] C O D E B A N C
[A D O B E C] O D E B A N C
CONTAINS ABC mark substring A D O B E C
...
[A D O B E C O D E B] A N C
B now > so moving left but A is compliance
...
[A D O B E C O D E B A] N C
A > moving left
A D O [B E C O D E B A] N C
B > moving left
A D O B E [C O D E B A] N C
C O D E B A is not shorter than A D O B E C
...
A D O B E [C O D E B A N C]
C > moving left
A D O B E C O D E [B A N C]
B A N C is shorter than A D O B E C mark substring B A N C
import java.util.HashMap;
import java.util.Map; public class MinimumWindowSubstring {
public void test(){
String s1 = "ADOBECODEBANC";
String t1 = "ABC";
// BANC
System.out.println(minWindow(s1,t1)); String s2 = "a";
String t2 = "aa";
// ""
System.out.println(minWindow(s2,t2)); String s3 = "a";
String t3 = "b";
// ""
System.out.println(minWindow(s3,t3)); String s4 = "a";
String t4 = "a";
// a
System.out.println(minWindow(s4,t4)); String s5 = "ab";
String t5 = "b";
// b
System.out.println(minWindow(s5,t5)); String s6 = "aa";
String t6 = "aa";
// aa
System.out.println(minWindow(s6,t6)); String s7 = "acbbaca";
String t7 = "aba";
// baca
System.out.println(minWindow(s7,t7)); String s8 = "aaaaaaaaaaaabbbbbcdd";
String t8 = "abcdd"; System.out.println(minWindow(s8,t8)); }
public String minWindow(String s, String t) {
if(s == null || t == null || s.isEmpty() || t.isEmpty() || s.length() < t.length()){
return "";
}
Map<Character,Integer> counter = new HashMap<>();
char[] sArray = s.toCharArray();
for(char c :t.toCharArray()){
counter.merge(c,1,(a,b)->a+b);
}
int left = 0;
int right ;
int[] ans = {-1 , 0 , 0};
Map<Character,Integer> window = new HashMap<>();
for(int i=0;i<sArray.length;i++){
char c = sArray[i];
right = i;
if(counter.containsKey(c)){
window.merge(c,1,(a,b)->a+b);
if(window.keySet().size() == counter.keySet().size()){
while (true){
Integer dec = window.get(sArray[left]);
Integer standard = counter.get(sArray[left]);
if(dec != null && standard != null){
if(dec <= standard){
break;
}
if(dec > standard){
window.merge(sArray[left],-1,(a,b)->a+b);
}
}
left ++;
}
boolean valid = true;
for(char v : counter.keySet()){
if(window.get(v) < counter.get(v)){
valid = false;
}
}
// mark if initial or shorter sequence
if(valid && (ans[0] == -1 || right - left + 1 < ans[0])){
ans[0] = right - left + 1;
ans[1] = left;
ans[2] = right;
}
}
}
}
return ans[0] == -1?"":s.substring(ans[1],ans[2]+1);
}
}

239. Sliding Window Maximum

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Return the max sliding window.

Input: nums = [,,-,-,,,,], and k =
Output: [,,,,,]
Explanation: Window position Max
--------------- -----
[ -] -
[ - -]
[- - ]
- [- ]
- - [ ]
- - [ ]
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
List<Integer> result = new ArrayList<>();
if(nums == null || nums.length == 0){
return new int[]{};
}
int left = 0;
int windowMax = Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
if(i - left + 1 > k){
int rv = nums[i];
int currentMax = windowMax;
if(nums[left] == windowMax){
currentMax = nums[left+1];
for(int t = left+1 ; t <= i ; t ++){
currentMax = Math.max(nums[t],currentMax);
}
}
windowMax = Math.max(currentMax,rv);
result.add(windowMax);
left ++ ;
} else {
windowMax = Math.max(nums[i],windowMax);
if(i - left + 1 == k){
result.add(windowMax);
}
}
}
int[] copyRes = new int[result.size()];
for(int index = 0 ; index < result.size() ; index ++){
copyRes[index] = result.get(index);
}
return copyRes;
}
}
												

从一道Hard学习滑动窗口的更多相关文章

  1. 【转】20-TCP 协议(滑动窗口——基础)

    https://blog.csdn.net/q1007729991/article/details/70142341 相信大家都遇到过这样的场景: 同学 Luffy 给你打电话,让你记下一串手机号码, ...

  2. 计算机网络之流量控制(停止-等待协议、滑动窗口、后退N帧协议GBN、选择重传协议SR)、滑动窗口、可靠传输机制

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/104908762 学习课程:<2019王道考研计算机网络> 学习目的 ...

  3. TCP协议总结--停止等待协议,连续ARQ协议,滑动窗口协议

    前言:在学习tcp三次握手的过程之中,由于一直无法解释tcpdump命令抓的包中seq和ack的含义,就将tcp协议往深入的了解了一下,了解到了几个协议,做一个小结. 先来看看我的问题: 这是用tcp ...

  4. [LeetCode] Sliding Window Median 滑动窗口中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  5. 第二十六节,滑动窗口和 Bounding Box 预测

    上节,我们学习了如何通过卷积网络实现滑动窗口对象检测算法,但效率很低.这节我们讲讲如何在卷积层上应用这个算法. 为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层.我们先讲解这 ...

  6. 一篇带你读懂TCP之“滑动窗口”协议

    前言 你现在的努力,是为了以后有更多的选择. 在上一篇文章通过"表白"方式,让我们快速了解网络七层协议了解了网络七层协议. 接下来我们要把重心放在网络传输的可靠性上面.一起来看TC ...

  7. 滑动窗口解决Substring Search Problem

    2018-07-18 11:19:19 一.Minimum Window Substring 问题描述: 问题求解: public String minWindow(String s, String ...

  8. [DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法

    4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1目标定位 对象定位localization和目标检测detection 判断图像中的对象是不是汽车--Image clas ...

  9. 单调队列优化&&P1886 滑动窗口题解

    单调队列: 顾名思义,就是队列中元素是单调的(单增或者单减). 在某些问题中能够优化复杂度. 在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会). 在你看到类似于滑动定长 ...

随机推荐

  1. DevOps - CI&CD

    1 - CI与CD的联系与区别 持续集成(Continuous Integration).持续交付(Continuous Delivery)和持续部署(Continuous Deployment)的过 ...

  2. C# 保留两位“有效数字”,而不是两位“小数”

    1.问题描述: 最近在处理软件结果显示时,发现如果利用 Math.Round(Number,N) 取N为小数时,有的结果不能显示完全 比如:15.3245 和 0.00106 两个数字,如果 N=2 ...

  3. LeetCode.1189-balloon实例数最大值(Maximum Number of Balloons)

    这是小川的第次更新,第篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第267题(顺位题号是1189).给定一个字符串文本,使用文本字符来构成单词"balloon&qu ...

  4. SSM项目模板

    项目一:恒德物流平台(SSM) ◎开发周期:3个月                           开发模式:团队4个人 ◎开发环境:jdk1.8.tomcat8.5       开发工具:IDE ...

  5. 架构模式: 命令查询职责分离 (CQRS)

    架构模式: 命令查询职责分离 (CQRS) 问题 如何在微服务架构中实现查询 结论 将应用程序拆分为两部分:命令端和查询端.命令端处理创建,更新和删除请求,并在数据更改时发出事件.查询端通过对一个或多 ...

  6. k8s 工具集

    Volcano 资源调度器 apollo 配置中心 spinnaker 持续部署系统 jaeger 分布式跟踪系统.它用于监视和诊断基于微服务的分布式系统,包括: 分布式上下文传播 分布式交易监控 根 ...

  7. MySQL知识篇-nmon监控

    说明1:监控MySQL服务器资源不止一种方式,这种nmon监控图形化.历史记录查询笔记方便,便于MySQL优化后,对比其效率不同,资源利用率不同. 说明2:摘抄自https://www.cnblogs ...

  8. SpringCloud学习(二)服务消费者(rest+ribbon)(Finchley版本)

    在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是fe ...

  9. SolidWorks学习笔记9 自顶向下方法

    目的:制作一个轴承. 先创建一个零件作为一级控件,(草图)如下,是轴承的横截面. 创建内环. 新建一个零件,然后选择插入=>零件,选择“一级控件”零件 创建卡环,插入零件,选择一级控件 然后再旋 ...

  10. 20个「MySQL」经典面试题,答对转dba 2w+「附答案」

    1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.MySQL中myisam与innodb的区别,至少5点 (1).问5点不同: (2).innodb引擎的4大特性 (3). ...