zoukankan      html  css  js  c++  java
  • LeetCode刷题感想之滑动窗口

        发现滑动窗口也是一种经典解题思路,这一篇简单聊一下滑动窗口。

        通常在碰到求XX子数组,子字符串,连续XX等题眼,可以考试用滑动窗口的思路来解决问题。

        窗口的类型有几种:

        1. 固定长度的窗口。

        2. 窗口大小未知,求最大/最小长度的窗口。

        不管是可变窗口还是固定窗口,核心思路需要指定左右指针 left 和 right。

        核心思路是:

        1. left = 0, 窗口的起点默认是数组的起点。

        2. right 根据条件初始化,即 right - left + 1 为窗口大小(固定窗口) 或者是 right = 0(可变窗口)

        3. 每一次循环中left 和 right 同时移动(固定窗口),只移动 right,只有当left满足条件时才移动(可变窗口)

        4. 每次循环都判断当前窗口内的元素是否满足要求,如果是求最优解,可以继续循环直到得到最优解。

        举个例子(https://leetcode-cn.com/problems/longest-subarray-of-1s-after-deleting-one-element/)

        

        给你一个二进制数组 nums ,你需要从中删掉一个元素。

        请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。

        如果不存在这样的子数组,请返回 0 。

        标准的滑动窗口的题目,而且是可变窗口!从核心思路来看,就是 left 和 right 初始化为0,根据条件变更 left 和 right 的位置。

       

    class Solution {
        public int longestSubarray(int[] nums) {
            int res = 0, sum = 0;
            int left = 0;
            for(int right = 0;right<nums.length;right++){
                sum += (nums[right]&1);
                while(left<right && sum <= right - left-1){
                    if(nums[left]==1) sum--;
                    left++;
                }
                res = Math.max(res,right-left);
            }
            return res;
        }
    }
    

      

  • 相关阅读:
    java设计模式笔记(1)-适配器模式
    linux下源码编译安装mysql
    spring boot入门
    2016年终总结
    CentOS获取公网IP
    shell中的$0 $n $# $* $@ $? $$
    shell中各种括号的作用详解()、(())、[]、[[]]、{}
    10个实战及面试常用Linux Shell脚本编写
    记录centos下nl与cat -n的不同
    grep、cut、awk、sed的使用
  • 原文地址:https://www.cnblogs.com/spillage/p/15540420.html
Copyright © 2011-2022 走看看