芝士算法 滑动窗口(1.0)

目录

长度最小的子数组

无重复字符的最长子串

最大连续1个数

[将 x 减到 0 的最小操作数](#将 x 减到 0 的最小操作数)


滑动窗口 : 通常通过两个指针(左指针和右指针,同向指针)来定义窗口的边界。右指针用于扩展窗口,左指针用于收缩窗口,通过调整指针位置来找到满足条件的解。

还是从题目出发更容易理解

长度最小的子数组

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {

    int sum = 0;
    int n = nums.length;
    int len = Integer.MAX_VALUE;
    for(int left = 0,right = 0; right < n ; right++){
        sum +=  nums[right] ;//进窗口
        while(sum >= target)//判断
        {
            
           len = Math.min(len, right - left + 1);
           sum -= nums[left++];//出窗口 + 结果更新
        }
    }
    return len == Integer.MAX_VALUE ? 0 : len;
}
}

无重复字符的最长子串

有了上一个题的基础 本题稍稍做了难度的提升

java 复制代码
public int lengthOfLongestSubstring(String s) {
        char[] s1 = s.toCharArray();
        int [] hash = new int[128];
        int n = s.length();
        int left =0; 
        int right =0;
        int ret = 0;
        while(right < n){
            hash[s1[right]]++;
            while(hash[s1[right]] > 1){
                hash[s1[left++]]--;
            }
            ret = Math.max(ret , right - left + 1);
            right++;
        } 
        return ret;
    }

最大连续1个数

java 复制代码
   public int longestOnes(int[] nums, int k) {
   
        int n  =nums.length;
        int ret = 0;
        for(int right = 0,left = 0,zero = 0; right < n ; right++){
            if(nums[right] == 0)//进窗口
            {
                zero++;
            }
            while(zero > k)//判断
            {
               if(nums[left++] == 0)//出窗口
               {
                zero--;
            }
            }
             ret = Math.max(ret,right - left + 1);
        }
        return ret;
    }

将 x 减到 0 的最小操作数

java 复制代码
public int minOperations(int[] nums, int x) {
        int n = nums.length;
        int sum = 0;
        for(int a : nums){
            sum += a;
        }
        int target = sum  - x;
        //细节处理
        if(target < 0)
        return -1;
         
        int len = -1;
        
        for(int right = 0, left = 0,tmp = 0; right < n ; right++){
            tmp += nums[right];
           
            while(tmp >  target){
                tmp -= nums[left++];
            }
            if(tmp == target){
                len = Math.max(len,right - left + 1);
            }
        }
        if(len == -1)
        return len;
       
        return n - len;
        
    }
相关推荐
LuminousCPP7 小时前
数据结构‑二叉树(二):二叉堆从零实现|Heap结构设计 + 建堆优化 + 堆排序深度解析
c语言·数据结构·笔记·二叉树
8 小时前
数据结构第一课:复杂度解析
数据结构
欧叶冲冲冲10 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
_Narcissus_11 小时前
链表算法题和静态链表
数据结构·c++·笔记·算法·链表·ai·力扣
Lyyaoo.11 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
疯狂打码的少年12 小时前
【数据结构】八大排序算法对比总结(时间/空间/稳定性)
数据结构·笔记·算法
Awh-17 小时前
数据结构 第六章:哈希存储
数据结构·算法·哈希算法
TAN-90°-18 小时前
Deep Learning for Computer Vision——Recurrent Neural Networks
数据结构·人工智能·rnn·深度学习·神经网络·机器学习·计算机视觉
wabs66618 小时前
关于栈【力扣150.逆波兰表达式求值的思考】
数据结构·c++·算法·leetcode··代码随想录
闻缺陷则喜何志丹18 小时前
【计算几何 第10章】更多几何数据结构:截窗
数据结构·数学·线段树·计算几何·截窗·优先查找树·区间树