滑动窗口算法学习

滑动窗口算法学习最近做了几道有关滑动窗口的算法,在此总结一下。滑动窗口就像描述的那样,可以理解成是一个会滑动的窗口,每次记录下窗口的状态,再找出符合条件的适合的窗口可以使用滑动窗口来减少时间复杂度经典滑动窗口题目给一组大小为n的整数数组,计算长度为k的子数组的最大值比如:数组{1,2,3,4,5,7,6,1,8},k=2,那么最终结果应该是7+6=13最大。最简单的是使用两层遍历,通过所有情况找…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

最近做了几道有关滑动窗口的算法,在此总结一下。

滑动窗口

  • 就像描述的那样,可以理解成是一个会滑动的窗口,每次记录下窗口的状态,再找出符合条件的适合的窗口
  • 可以使用滑动窗口来减少时间复杂度

经典滑动窗口题目

给一组大小为n的整数数组,计算长度为k的子数组的最大值
比如:数组{1,2,3,4,5,7,6,1,8},k=2,那么最终结果应该是7+6=13最大。
最简单的是使用两层遍历,通过所有情况找出最大的一个子数组,时间复杂度O(N^2)
使用滑动窗口,从[0,k-1]的一个窗口,记录其总和,然后窗口向右移动到[1,k],再到[2,k+1],直到数组的最尾端,找出里面总和最大的一个窗口,这样的解法就是滑动窗口算法。

//Java代码:
public class SlidingWindow {
    public static int maxnum(int[] array,int k){
        if(array.length<k){//如果k比数组长度还大,返回-1
            return -1;
        }
        int left=0;
        int sum=0;
        for(int i=0;i<k;i++){
            sum+=array[i];
        }
        int tempsum=sum;//tempsum记录每个窗口的总和
        while (left+k<array.length){
            tempsum=tempsum-array[left]+array[left+k];
            left++;
            sum=Math.max(sum,tempsum);//sum取原sum和tempsum的较大值
        }
        return sum;
    }
    public static void main(String[] args) {
        int[] arr={1, 4, 2, 10, 2, 3, 1, 0, 20};
        int k=3;
        System.out.println(maxnum(arr,k));
    }
}

Jetbrains全家桶1年46,售后保障稳定

字符串中的使用

  • 问题描述:
    给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
    注意子串要与 words 中的单词完全匹配,中间不能有其他字符
public class Matching {

    public static List<Integer> findSubstring(String s,String[] words){
        List<Integer> res=new ArrayList<>();
        if(s==null||s.length()==0||words==null||words.length==0)
            return res;
        HashMap<String,Integer> map=new HashMap<>();//储存words字符数组,value值为出现的次数
        int word=words[0].length();//每个子串的长度
        int number=words.length;//子串的个数
        for(String w:words){
            map.put(w,map.getOrDefault(w,0)+1);//map中如果没有当前子串,则放入;如果有数目+1
        }
        for(int i=0;i<word;i++){
            int left=i,right=i,count=0;
            HashMap<String,Integer> temp=new HashMap<>();
            while (right+word<=s.length()){
                String match=s.substring(right,right+word);//滑动窗口
                right+=word;
                if(!map.containsKey(match)){
                    count=0;
                    left=right;
                    temp.clear();
                }
                else {
                    temp.put(match,temp.getOrDefault(match,0)+1);
                    count++;
                    while (temp.getOrDefault(match,0)>map.getOrDefault(match,0)){//如果匹配的个数多了,向右滑动word个字符
                        String match1=s.substring(left,left+word);
                        count--;
                        temp.put(match1,temp.getOrDefault(match1,0)-1);
                        left+=word;
                    }
                    if(count==number) res.add(left);
                }
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String s = "barfoothefoobarman";
        String[] words = {"foo","bar"};
        System.out.println(findSubstring(s,words));
    }

}
  • 问题描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    输入: “abcabcbb”
    输出: 3
class Solution {
    public int lengthOfLongestSubstring(String s) {
        //使用HashSet作为滑动窗口,找出无重复字符的最长子串。
        Set<Character> set=new HashSet<>();
        int ans=0,i=0,j=0;//i为滑动窗口的左边,j为右边
        while(i<s.length()&&j<s.length()){
            if(!set.contains(s.charAt(j))){//如果没有重复
                set.add(s.charAt(j++));
                ans=Math.max(ans,j-i);
            }
            else{//如果出现重复
                set.remove(s.charAt(i++));
            }
        }
        return ans;
    }
}

用滑动窗口用来解决求字符串,数组等连续的子串或子数组的问题比较简单。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206701.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何理解无偏估计量_无偏估计量是唯一的吗

    如何理解无偏估计量_无偏估计量是唯一的吗现实中常常有这样的问题,比如,想知道全体女性的身高均值 ,但是没有办法把每个女性都进行测量,只有抽样一些女性来估计全体女性的身高:那么根据抽样数据怎么进行推断?什么样的推断方法可以称为“好”?1无偏性比如说我们采样到的女性身高分别为:那么:是对 不错的一个估计,为什么?因为它是无偏估计。首先,真正的全体女性的身高均值 ,我们是不知道,只有上帝才知道,在图中就画…

    2025年8月18日
    2
  • android Handler的使用(一)

    android Handler的使用(一)

    2021年8月22日
    58
  • Java程序设计基础笔记 • 【第1章 初识Java】[通俗易懂]

    Java程序设计基础笔记 • 【第1章 初识Java】[通俗易懂]本章目录1.1程序的概念及Java语言介绍1.1.1生活中的程序1.1.2计算机程序1.1.3算法和流程图1.1.4实践练习1.2配置JDK环境1.2.1Java的发展1.2.2应用领域1.2.3Java的优势1.2.4JDK概述1.2.5配置开发环境1.2.6实践练习1.3Java程序编写基础1.3.1Java程…

    2022年6月22日
    25
  • html embed自动播放,html embed标签怎么用

    html embed自动播放,html embed标签怎么用HTMLembed 标签使用方法和属性详解一 基本语法代码如下 embedsrc url 说明 embed 可以用来插入各种多媒体 格式可以是 Midi Wav AIFF AU MP3 等等 Netscape 及新版的 IE 都支持 url 为音频或视频文件及其路径 可以是相对路径或绝对路径 示例 代码如下二 属性设置 1 自动播放 语法 autostart true false 说明 该属性规定音频或视频文件

    2025年12月10日
    5
  • Origin绘图之条形图上加曲线拟合图

    Origin绘图之条形图上加曲线拟合图图形使用情境有时,写论文时,我们要做一些描述性统计,经常用到条形图来表示我们的数据,同时在条形图上可以加入曲线拟合的情况。如下图所示:绘图操作本博客以origin2017操作为例。首先是导入我们要绘图的数据,如下图所示:接着,按照下图所示操作,选择bar(条形图)最后,按照下图操作就行了…

    2022年5月16日
    63
  • 初探粒子群优化算法(PSO)[通俗易懂]

    初探粒子群优化算法(PSO)[通俗易懂]初探粒子群优化算法(PSO)粒子群优化算法简介PSO的优点PSO的缺点PSO的原理及基本概念算法描述参数分析粒子群的拓扑结构初始化时的前人经验粒子群优化算法简介粒子群优化算法(PSO)最初是由Kennedy和Eberhart博士于1995年受人工生命研究的结果启发,在模拟鸟群觅食过程中的迁徙和群集行为时提出的一种基于群体智能的演化计算技术。PSO是一种随机全局优化技术,通过粒子间的相互作用发现复杂搜索空间中的最优区域。由于PSO算法独特的优势,在工程领域中收到研究者的广泛关注。PSO算法归根到底是一

    2022年10月11日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号