数据结构与算法 -- 滑动窗口

什么是滑动窗口?

窗口,其实就是一个队列;滑动窗口,就是将这个队列朝着一个方向滑动,也就是将先进入队列的元素移出,重新往队列中添加元素。

Leetcode 3.无重复字符的最长子串

题目描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:输入: "abcabcbb",输出: 3 ,解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:输入: "bbbbb",输出: 1,解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:输入: "pwwkew",输出: 3,解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路:使用滑动窗口,比如例题中的 abcabcbb,首先进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。

所以,我们要移动这个队列!如何移动?我们只要把队列的左边的元素移出就行了,然后添加新元素,直到满足题目要求!一直维持这样的队列,

找出队列出现最长的长度时候,求出解!时间复杂度:O(n)。

public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        String s1 = null;
        String s2 = "";
        String s3 = "abcabcbb";
        String s4 = "bbbbb";
        String s5 = "pwwkew";
        System.out.println(solution.lengthOfLongestSubstring(s1));
        System.out.println(solution.lengthOfLongestSubstring(s2));
        System.out.println(solution.lengthOfLongestSubstring(s3));
        System.out.println(solution.lengthOfLongestSubstring(s4));
        System.out.println(solution.lengthOfLongestSubstring(s5));
    }
    public int lengthOfLongestSubstring(String s) {
        if(null == s) {
            return 0;
        }
        Queue<Character> queue = new LinkedList<Character>();
        char[] charArray = s.toCharArray();
        int longestLength = 0;
        for(char item : charArray) {
            while(queue.contains(item)) {
                queue.remove();
            }
            queue.add(item);
            longestLength = Math.max(longestLength, queue.size());
        }
        return longestLength;
    }
}

原文地址:https://www.cnblogs.com/jiangwangxiang/p/11143396.html

时间: 2024-10-07 00:26:10

数据结构与算法 -- 滑动窗口的相关文章

算法--滑动窗口

转载请标明出处http://www.cnblogs.com/haozhengfei/p/a14049ec0869a8125a69f3af37471c77.html 滑动窗口练习题 第8节 滑动窗口练习题 有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置. 返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值. 以数组为[4,3,5,4,3,3,6,7],w=3为例.因为第一个窗口[4,3,5]的最大值为5,第二个窗口[3

算法-滑动窗口的中位数(堆)

今天在网上刷了一道关于堆的题,感觉有所收获.因为在这里之前,之前从来没有接触过关于堆的题目. 题意: 给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中 滑动这个窗口,找到数组中每个窗口内的中位数.(如果数组个数是偶数,则在 该窗口排序数字后,返回第 N/2 个数字.) 样例: 对于数组 [1,2,7,8,5], 滑动大小 k = 3 的窗口时,返回 [2,7,7] 最初,窗口的数组是这样的: [ | 1,2,7 | ,8,5] , 返回中位数 2; 接着,窗口继续向

TCP数据量--滑动窗口、拥塞窗口、慢启动、Negle算法 经受时延的确认等

TCP的数据流大致可以分为两类,交互数据流与成块的数据流.交互数据流就是发送控制命令的数据流,比如relogin,telnet,ftp命令等等:成块数据流是用来发送数据的包,网络上大部分的TCP包都是这种包. 很明显,TCP在传输这两种类型的包时的效率是不一样的,因此为了提高TCP的传输效率,应该对这两种类型的包采用不同的算法. 总之,TCP的传输原则是尽量减少小分组传输的数量. TCP的交互式数据流 ?         经受时延的确认技术 TCP的交互式数据流通常使用"经过时延的确认"

算法设计与优化策略——滑动窗口

"滑动窗口"和上篇博客中介绍的"等价转换"一样也为一种算法优化的思想.同样,下面通过一个例子,来介绍这种思想.唯一的雪花(Unique snowflake,UVa 11572)输入一个长度为n(n<=10^6)的序列A,找到一个尽量长的连续子序列AL~AR,使得该序列中没有相同的元素.在读完题目以后,我们不难有思路.最简单的思路就是,我们可以通过循环的方法,对每一个元素都找出一它为开头的最长序列(没有相同元素).这个方法也能做出来,但似乎有点太麻烦了.下面,我

粘包、拆包发生原因滑动窗口、MSS/MTU限制、Nagle算法

[TCP协议](3)---TCP粘包黏包 有关TCP协议之前写过两篇博客: 1.[TCP协议](1)---TCP协议详解 2.[TCP协议](2)---TCP三次握手和四次挥手 一.TCP粘包.拆包图解 假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到字节数是不确定的,故可能存在以下四种情况: 1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包 2)服务端一次接受到了两个数据包,D1和D2粘合在一起,称之为TCP粘包 3)服务端分两次读取到了数据包,

第二十四个知识点:描述一个二进制m组的滑动窗口指数算法

第二十四个知识点:描述一个二进制m组的滑动窗口指数算法 简单回顾一下我们知道的. 大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法.因此,现代密码学需要大指数模幂算法的有效实现.我们应该从一个简化的方案开始思考:计算\(x^a\mod N\),我们可以用指数算法来求\(x^a\),然后再约减到\(N\).然而,对大多数密码算法来说,\(x^a\)都是非常大的.现在,大多数传统的方法能被简单的在每个阶段模\(N\).这回产生一些改进的技术.下面我会介绍一些计算\(X^E \mo

算法题解之滑动窗口

Substring with Concatenation of All Words 寻找所有词连接的子串 思路:由于该字串是所有词典中的词连接的,所以该字串长度固定.因此本题可以看作一个滑动窗口的题.为了去除重复工作,每次滑动一个单词的长度,因此起始位置就有n种(n为单词长度).每种起始位置的滑动策略如下: 如果当前窗口满足条件,则窗口只往后移动一个单词,并且下一次只检查最后一个单词(中间的单词肯定满足条件).    如果当前窗口不满足条件,则有两种情况: 1.当前窗口内不满足条件的第一个单词不

LeetCode-Minimum Window Substring-最小窗口子串-滑动窗口算法(尺取法)

https://oj.leetcode.com/problems/minimum-window-substring/ 线性复杂度的限制下,考虑使用滑动窗口法.这个方法的思路就是维持一个窗口,窗口向右边界扩张以满足限制条件.窗口左边界收缩以尽量使其最小. 注意这个题目可能是一个典型的滑动窗口方法的实现.外部循环移动左边界i,循环内部扩张右边界p以满足限制条件.并且内外都有终止可能. 使用两个map和一个计数变量以快速统计条件限制的满足情况. class Solution { public: int

滑动窗口算法

概述滑动窗口实现了TCP流控制.首先明确滑动窗口的范畴:TCP是双工的协议,会话的双方都可以同时接收和发送数据.TCP会话的双方都各自维护一个发送窗口和一个接收窗口.各自的接收窗口大小取决于应用.系统.硬件的限制(TCP传输速率不能大于应用的数据处理速率).各自的发送窗口则要求取决于对端通告的接收窗口,要求相同. 滑动窗口解决的是流量控制的的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致.接收端的缓存传输数据给应用层,但这个过程不一定是即时的,如果发送速度太快,会出现接收