跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

牛客 NC221681 dd 爱框框:滑动窗口解法实战

综述由AI生成牛客 NC221681 题目要求寻找和大于等于 x 的最短连续子数组。采用滑动窗口算法,通过双指针动态维护窗口区间,在遍历过程中实时计算区间和并更新最小长度记录。该方法避免了暴力枚举,将时间复杂度优化至线性级别,适合处理大规模数据场景下的区间查询问题。

雾岛听风发布于 2026/3/22更新于 2026/5/15 浏览
牛客 NC221681 dd 爱框框:滑动窗口解法实战

题目背景

给定一个正整数数组和一个目标值 x,需要找到和大于等于 x 的最短连续子数组的长度。

算法思路

解决这类'最短连续子数组'问题的经典方法是滑动窗口。我们维护两个指针,分别代表窗口的左边界和右边界。右指针不断向右扩展以累加数值,一旦窗口内的总和达到或超过目标值 x,我们就尝试收缩左边界,看看能否在保持条件满足的前提下缩小窗口范围。

具体流程如下:

初始化左右指针均为 0,累加器 sum 为 0。右指针 cur 每次向右移动一步,将当前元素加入 sum。当 sum 大于等于 x 时,说明找到了一个可行解,此时记录当前的窗口位置。接着,为了寻找更短的窗口,我们尝试移除左指针指向的元素,并将左指针右移,重复检查 sum 是否仍满足条件。如果不再满足,则停止收缩,继续移动右指针。

这个过程保证了我们在遍历数组的同时,动态地维护了所有可能的合法窗口,并从中筛选出长度最小的那个。

代码实现

下面是基于 C++ 的具体实现,重点展示了如何维护窗口状态以及更新最优解。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, x;
    cin >> n >> x;
    vector<int> arr(n);
    for(int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    // 用于存储最终结果的起始和结束索引(0-based)
    int index[2] = {0};
    
    // 滑动窗口指针
    int cur = 0;      // 右指针
    int prev = 0;     // 左指针
    int sum = 0;      // 当前窗口和

    while(cur < n) {
        sum += arr[cur];
        
        // 当窗口和满足条件时,尝试收缩左边界
        while(sum >= x) {
            // 第一次找到解,直接记录
            if(index[] ==  && index[] == ) {
                index[] = prev;
                index[] = cur;
                sum -= arr[prev++];
                ;
            }
            
            
             length = index[] - index[];
             camplen = cur - prev;
            
            
            (length == camplen || length > camplen) {
                (prev < index[] || length > camplen) {
                    index[] = prev;
                    index[] = cur;
                }
            }
            
            
            sum -= arr[prev++];
        }
        
        
        cur++;
    }

    
    cout << index[] +  <<  << index[] +  << endl;
     ;
}
0
0
1
0
0
1
continue
// 比较当前窗口长度与已记录的最优长度
int
1
0
int
// 如果当前窗口更短,或者长度相等但起始位置更靠前
if
if
0
0
1
// 收缩窗口
// 移动右指针
// 输出结果,转换为 1-based 索引
0
1
' '
1
1
return
0

关键点说明

在实际运行中,需要注意几个细节。首先是初始化的判断,因为数组索引从 0 开始,而题目通常要求输出 1-based 的位置,所以最后输出时需要加 1。其次,在收缩窗口时,必须确保逻辑严密,虽然本题逻辑中 sum 的变化自然限制了这一点,但在处理负数或其他变体时需格外小心。此外,变量命名尽量直观,比如用 cur 表示当前考察位置,prev 表示窗口前驱,这样阅读代码时更容易理解窗口的动态变化过程。

目录

  1. 题目背景
  2. 算法思路
  3. 代码实现
  4. 关键点说明
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Vite 代理与 Nginx 代理:开发与生产环境的配置差异
  • 基于 Leaflet 和天地图的免费运动场所 WebGIS 可视化
  • SpringBoot 整合 Neo4j 图数据库实战指南
  • OpenClaw 对接飞书机器人配置踩坑:消息不回与 Gateway 断开排查
  • C++ AIGC 吞吐量优化实战:编译与运行时技巧提升 300%
  • 数据分析职业发展路径与核心技能体系解析
  • Whisper-Large-V3-Turbo 高效部署与性能解析
  • 攻防世界 Web 题解:Lottery 与 ics-05 漏洞分析
  • 前端视角 | 从零搭建并启动若依后端(环境配置)
  • 2024 大模型学习路线:从零基础到精通的系统指南
  • 2026年AI漫剧工具排行榜:11款软件横向对比
  • VMware Workstation Pro 官方下载指南(Windows/Linux)
  • 2026 年 Trae 收费模式变更与 AI 编程成本分析
  • 二叉树层序遍历算法:BFS 思路与 C++ 实现
  • MiniMax 开源 MiniMax-M2.5 模型:编程与智能体性能突破
  • 交换瓶子问题 Java 最小交换次数解法
  • C++ 笔试刷题实战:打怪、字符串分类及城市群问题解析
  • CentOS 7.9 Docker 安装、配置与实战指南
  • Java 处理 JSON 编程实用技巧
  • ComfyUI 安装指南:Python 环境配置与 WebUI 模型共享

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online