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

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

滑动窗口解决最短子数组和问题。通过双指针维护区间和,右指针扩展窗口,左指针收缩以满足条件,记录满足条件的最小长度区间起止位置。时间复杂度 O(N),空间复杂度 O(1)。

FrontendX发布于 2026/3/23更新于 2026/5/87 浏览
牛客 NC221681 dd 爱框框:滑动窗口解法详解

题目描述

给定一个包含 n 个正整数的数组和一个目标值 x,请找出和大于等于 x 的最短连续子数组,并输出其起始和结束位置(从 1 开始计数)。

解题思路

这道题是典型的滑动窗口问题。核心在于维护一个动态区间 [prev, cur],通过移动左右指针来调整区间和。

具体策略如下:

  1. 初始化:定义两个指针 prev 和 cur,初始均为 0,sum 记录当前窗口内的元素总和。
  2. 扩张窗口:cur 向右移动,将新元素加入 sum。
  3. 收缩窗口:当 sum >= x 时,说明当前窗口满足条件。此时需要尝试缩小窗口以寻找更优解。记录当前的 prev 和 cur 作为潜在结果,然后减去 arr[prev] 并将 prev 右移。
  4. 重复:只要 sum 仍满足条件,继续收缩;否则继续扩张 cur。

注意代码中对于索引记录的细节,需确保在找到更短或同等长度但更靠前的区间时更新结果。

代码实现

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

int main() {
    // 输入处理
    int n, x;
    cin >> n >> x;
    vector<int> arr(n, 0);
    for (int i = 0; i < n; i++) cin >> arr[i];

    int index[2] = {0}; // 用于保存最终结果的起止下标
    int cur = 0;
    int prev = 0;
    int sum = 0;

    while (cur < n) {
        sum += arr[cur];
        // 当和满足条件时,尝试收缩左边界
        while (sum >= x) {
            // 第一次找到有效区间
            if (index[0] ==  && 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
1
0
0
1
continue
int
1
0
int
// 比较长度,更新最优解
if
if
0
0
1
// 输出结果(转换为 1-based 索引)
0
1
' '
1
1
return
0

总结

该解法利用双指针技巧,每个元素最多被访问两次,时间复杂度为 O(N)。在实际面试或笔试中,处理边界条件和索引更新逻辑是关键点。

目录

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

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

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

更多推荐文章

查看全部
  • 解决 JPA 中 new Date() 插入数据库时间差 8 小时问题
  • Cursor 与 Copilot 组合实战:AI 编程效率提升指南
  • 语义化 AI 驱动器:提示词工程的技术演进与未来图景
  • Python 数据分析:学生画像匹配与相似度计算
  • Llama.cpp 本地部署大模型实战
  • TeleGrip:基于 VR 的机械臂遥操作系统架构与源码解析
  • 道德驱动机制设计在分层碳交易市场的应用
  • AI 赋能网络安全:入侵检测与恶意软件分析实战
  • Linux 系统编程入门:环境搭建指南
  • Python 网易云音乐数据分析可视化平台 Flask+ECharts 多维度分析
  • PythonWin7 项目指南:在 Windows 7 上安装 Python 3.8+
  • 被工具定义的编程时代:VS Code 与 JetBrains 效率指南
  • 三款主流云电脑部署 DeepSeek 模型性能实测对比
  • 企业微信接入 AI 小助手:基于回调接口的群聊机器人实战
  • ToDesk、顺网云与海马云运行 DeepSeek 模型性能对比评测
  • 91n 边缘计算设备部署轻量 TensorFlow 模型全流程
  • 人工智能时代转型 AI 产品经理指南:核心技能与实战路径
  • VRM4U 插件完整指南:在 Unreal Engine 5 中高效处理 VRM 模型
  • 如何在项目中启用 MISRA C++ 检查
  • 使用 LLaMA-Factory 微调 Qwen2.5 模型并转换为 GGUF 格式部署

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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