优选算法——滑动窗口2

优选算法------滑动窗口

1.1004. 最大连续1的个数 III

题目描述

思路分析

这道题的核心是:找一个最长的子数组,其中最多包含 k 个 0

经典的 滑动窗口 问题。

为什么用滑动窗口?

  • 我们需要连续区间 → 滑动窗口天然适合
  • 窗口内维护「0 的个数 ≤ k」这个约束
  • 窗口扩张:右指针右移,遇到 0 就计数
  • 窗口收缩:当 0 的个数超过 k,左指针右移直到满足条件

算法流程

复制代码
1. 初始化:left = 0, zeroCount = 0, maxLen = 0
2. 遍历数组,right 指针右移:
- 如果 nums[right] == 0,zeroCount++
- 当 zeroCount > k 时,收缩左边界:
- 如果 nums[left] == 0,zeroCount--
- left++
- 更新 maxLen = max(maxLen, right - left + 1)
3. 返回 maxLen

代码实现

cpp 复制代码
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int zero=0;
        int ret=0;
        for(int left=0,right=0;right<nums.size();right++)
        {
            if(nums[right]==0) zero++;//进窗口
            while(zero>k) //判断
            if(nums[left++]==0) zero--;//出窗口
            ret=max(ret,right-left+1);
        }
        return ret;
    }
};

2.1658. 将 x 减到 0 的最小操作数

题目描述

给定一个整数数组 nums 和整数 x。每次操作可以从数组最左端或最右端 移除一个元素,使 x 减去该元素的值。返回将 x 恰好减到 0 的最小操作数,无法实现则返回 -1。

示例:

复制代码
输入:nums = [1,1,4,2,3], x = 5
输出:2
解释:移除最右端的 3,再移除最右端的 2,x = 5 - 3 - 2 = 0

思路分析

逆向思维 + 滑动窗口

从两端取数 → 等价于找一个中间连续子数组 ,其和为 total - x

  • 设数组总和为 sum
  • 问题转化为:找最长 的子数组,使其和为 sum - x
  • 最小操作数 = n - 最长子数组长度

为什么?

  • 两端取走的元素和 = x
  • 剩下中间的元素和 = sum - x
  • 操作数最少 → 中间剩余最长

算法流程

复制代码
1. 计算 target = sum(nums) - x
2. 如果 target &lt; 0,返回 -1(总和都不够减)
3. 滑动窗口找和为 target 的最长子数组
4. 返回 n - maxLen(若 maxLen 有效)

代码实现

cpp 复制代码
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0;
        int cmp=0;
        int ret=-1;
        for(auto e :nums)
        {
            sum+=e;
        }
        int target=sum-x;

        if(target<0)
        return -1;
        for(int left=0,right=0;right<nums.size();right++)
        {
            cmp+=nums[right];//进窗口
            while(cmp>target)//判断
            {
                cmp-=nums[left++];//出窗口
            }
            if(cmp==target)//更新结果
            ret=max(ret,right-left+1);
        }
        if(ret==-1) 
        return ret;
        else
        return nums.size()-ret;
    }
};
相关推荐
行者全栈架构师1 分钟前
【码动四季】Spring Boot 可观测性体系:Micrometer + OpenTelemetry + Grafana 全链路搭建
java·算法·架构
TCW11214 分钟前
AI底层系列:用C++实现线性代数的公式推导与算法设计-8.线性变化(3)
c++·人工智能·算法
皓月斯语42 分钟前
B3849 [GESP样题 三级] 进制转换 题解
c++·算法·题解
中微极客1 小时前
剪枝与量化:让YOLO在边缘设备上高效部署
算法·yolo·剪枝
Ljwuhe1 小时前
C++——模板进阶
开发语言·c++
hehelm1 小时前
AI 大模型接入 SDK —项目概述
linux·服务器·网络·数据库·c++
牢姐与蒯1 小时前
双指针算法
数据结构·算法
Hesionberger2 小时前
LeetCode406:重建身高队列精髓解析
开发语言·数据结构·python·算法·leetcode
不要葱花2 小时前
接下来我将复现 10 篇强化学习算法:第 3 篇,一杯喜茶,搞定 Search-R1
算法·面试