跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

NC221681 dd 爱框框:滑动窗口算法实战

题目要求在给定数组中找到满足区间和大于等于 x 的子数组。核心思路是利用滑动窗口维护当前区间的和,通过移动左右指针动态调整窗口范围。当和满足条件时记录位置并尝试收缩左边界,否则扩展右边界。该方案时间复杂度为 O(n),空间复杂度 O(1),适合处理此类区间查询问题。

WenxuanMa发布于 2026/3/27更新于 2026/9/1056 浏览
NC221681 dd 爱框框:滑动窗口算法实战

题目描述

文章配图

文章配图

算法原理

这道题的核心在于利用滑动窗口来高效地寻找满足条件的子数组。我们不需要枚举所有可能的区间,而是通过两个指针动态维护一个窗口。

初始化时,定义左右指针 prev 和 cur 均指向数组起始位置,同时用一个变量 sum 记录当前窗口内的元素总和。逻辑主要分为两种情况:

当 sum 小于目标值 x 时,说明当前窗口还不够大,需要扩大右边界,即 cur 向右移动,并将新加入的元素累加到 sum 中。

一旦 sum 达到或超过 x,我们就找到了一个可行解。此时需要保存当前的左右边界信息。为了寻找更优解(通常是最短或特定条件下的区间),我们在满足条件的前提下,尝试收缩左边界:减去 arr[prev] 的值,并将 prev 右移。只要收缩后 sum 依然满足条件,就继续记录并收缩,直到不满足为止。

重复上述过程,直到右指针遍历完整个数组。

代码实现

下面是完整的 C++ 实现,注意处理输入输出格式以及索引转换(题目通常要求 1-based 索引)。

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

int main() {
    // 读取输入规模 n 和目标值 x
    int n, x;
    cin >> n >> x;

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

    // 用于保存最终结果的索引对 [start, end]
    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] == 0 && index[1] == 0) {
                index[0] = prev;
                index[1] = cur;
                sum -= arr[prev++];
                continue;
            }

            // 比较当前窗口长度与已记录窗口的长度
            int length = index[1] - index[0];
            int camplen = cur - prev;

            // 如果当前窗口更短或长度相等但起始位置更前,则更新结果
            if (length == camplen || length > camplen) {
                if (prev < index[0] || length > camplen) {
                    index[0] = prev;
                    index[1] = cur;
                }
            }

            // 收缩左边界
            sum -= arr[prev++];
        }
        // 右指针继续右移
        cur++;
    }

    // 输出结果,转换为 1-based 索引
    cout << index[0] + 1 << ' ' << index[1] + 1 << endl;
    return 0;
}

目录

  1. 题目描述
  2. 算法原理
  3. 代码实现

更多推荐文章

查看全部
  • 基于多智能体强化学习的医疗检索增强生成系统:MMOA-RAG 架构设计与实现
  • JSON 与 XML 数据交换格式深度对比
  • libwebkit2gtk-4.1-0 安装失败时的备选库兼容性评估
  • GraphRAG实战:用DeepSeek和Neo4j做知识推理
  • 基于 MATLAB 的 A_Satr 算法多机器人分布式动态避障与领袖跟随策略(含 EKF)
  • Nano Banana AI 绘画提示词资源站精选与使用指南
  • Windows 7 系统下 Git 安装与配置详解
  • LeetCode 85. 最大矩形算法解析与 Java 实现
  • Java JDK 21 安装与环境配置指南(Windows + macOS)
  • SkyWalking 接入 Spring Cloud Alibaba 微服务:从链路追踪到告警
  • Whisper 本地部署完整指南
  • 使用 Ollama + AnythingLLM 搭建本地知识库
  • Git 用户名与邮箱配置指南
  • Qwen3-32B 本地部署与 Clawdbot WebSocket 网关实践
  • C++ 迭代器失效详解
  • 医疗连续体机器人模块化控制界面设计与 Python 应用(下)
  • 开源 ROS 智能割草机器人:硬件选型、软件架构与部署指南
  • C++ 面向对象编程:深入解析继承机制
  • Claude Code Router 结合内网穿透实现多模型路由与公网访问
  • Java 文档注释(Javadoc)核心用法与规范

相关免费在线工具

  • 加密/解密文本

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