优选算法——滑动窗口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;
    }
};
相关推荐
元启数宇7 分钟前
幕墙AI设计算法逻辑:元启数宇如何智能分格
人工智能·算法
宵时待雨11 分钟前
优选算法专题16:多源BFS
算法·宽度优先
重生之后端学习15 分钟前
53. 最大子数组和[中等]✅
java·数据结构·算法·leetcode·职场和发展
水饺编程28 分钟前
第5章,[Win32 章节] :绘图模式
c语言·c++·windows·visual studio
INGNIGHT43 分钟前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
lucas_AI1 小时前
把表格压成 64 个 token,长文档问答反而更准了:先找表,再看数
人工智能·深度学习·算法
小小杨树1 小时前
【C++】学习:双缓冲视频流水线深解析
c++·性能优化·音视频开发
Zzz 小生1 小时前
Lazy Theta*:把昂贵的视线检测留到“真正需要”时再做
人工智能·算法·贪心算法·推荐算法
l1258652 小时前
# LangGraph Deep Research Agent 全流程设计:多轮研究、人机协同与真实来源管理
数据库·人工智能·python·算法·自然语言处理·oracle·langchain
青少儿编程课堂3 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛