滑动窗口


  滑动窗口(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. IDEA如何构建mybatis

    任何一个软件都要和数据库关联,软件需要的数据都存储在数据库中. 对于经常使用的数据库相关的代码就出现了很多冗余的代码,持久层框架也随之出现. 目前使用比较流程的持久层框架有hibernate和myba ...

  2. JAVA RMI分布式原理和应用

    RMI(Remote Method Invocation)是JAVA早期版本(JDK 1.1)提供的分布式应用解决方案,它作为重要的API被广泛的应用在EJB中.随着互联网应用的发展,分布式处理任务也 ...

  3. mysql安装报vcruntime140.dll缺失

    mysql安装报:vcruntime140.dll缺失 安装:Visual C++ Redistributable for Visual Studio 2015 可以解决此问题

  4. Java网络编程简明教程

    Java网络编程简明教程 网络编程  计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算 ...

  5. TLC编程

    NAND Flash可以划分为SLC.MLC和TLC SLC:单阶存储单元,读写速率快,可擦写次数高 MLC和TLC:多阶存储单元,MLC每个存储单元中存储2 bit数据,可以表示四种数据:SLC每个 ...

  6. C语言递归之对称二叉树

    题目描述 给定一个二叉树,检查它是否是镜像对称的. 示例 二叉树 [1,2,2,3,4,4,3] 是对称的. / \ / \ / \ [1,2,2,null,3,null,3] 则不是镜像对称的. / ...

  7. 看kubelet的日志 + Kubeadm安装Kubernetes环境

    1.通过journalctl看日志 journalctl -xeu kubelet > a参考:https://www.cnblogs.com/ericnie/p/7749588.html

  8. Hbase和Hadoop的内存参数调优 + 前端控制台

    1.hadoop的内存配置调优 mapred-site.xml的内存调整 <property> <name>mapreduce.map.memory.mb</name&g ...

  9. 【转帖】Office的光荣历史(1)

    Office的光荣历史(1) https://www.sohu.com/a/201410882_657550 微软的第一版本的office 竟然是 给Mac OS 提供的.. 2017-10-31 1 ...

  10. 什么是阿里云ACA认证

    阿里云云计算助理工程师认证(ACA - 
Alibaba Cloud Certified Associate)是面向使用阿里云基础产品的专业技术认证,主要涉及阿里云的计算.存储.网络.安全类的核心产品 ...