LeetCode LCR180文件组合

news/2025/2/2 11:55:12/

滑动窗口算法:寻找连续文件编号组合

问题描述

在文件传输过程中,待传输的文件被切分成多个部分,每个部分的文件编号为一个正整数(至少有两个文件)。传输的要求是:找到所有连续文件编号的组合,使得这些文件编号的总和等于接收方指定的数字 target。返回的结果需要满足以下规则:

  1. 每种组合按照文件编号升序排列。

  2. 不同组合按照第一个文件编号升序排列。

例如,当 target = 15 时,符合条件的组合有:

  • [1, 2, 3, 4, 5](因为 1 + 2 + 3 + 4 + 5 = 15

  • [4, 5, 6](因为 4 + 5 + 6 = 15

  • [7, 8](因为 7 + 8 = 15

解题思路

这个问题可以看作是一个典型的滑动窗口问题。我们需要找到所有连续的文件编号组合,使得它们的总和等于 target。滑动窗口算法非常适合解决这种连续子数组或子序列的问题。

滑动窗口的核心思想

滑动窗口算法通过维护一个窗口(通常是一个连续的子数组或子序列),在满足一定条件的情况下,动态调整窗口的起始和结束位置。具体到这个问题:

  1. 初始化窗口:使用两个指针 left 和 right,分别指向窗口的起始和结束位置。

  2. 计算窗口内的总和

    • 如果总和小于 target,则扩大窗口(移动 right 指针)。

    • 如果总和大于 target,则缩小窗口(移动 left 指针)。

    • 如果总和等于 target,则记录当前的组合,并继续寻找下一个可能的组合。

  3. 终止条件:当 left 指针超过 target / 2 时,停止搜索(因为至少需要两个文件编号)。

为什么滑动窗口适合这个问题?

  • 连续子序列:文件编号是连续的,滑动窗口天然适合处理连续子序列的问题。

  • 高效性:滑动窗口的时间复杂度为 O(n),远优于暴力枚举的 O(n²)。

  • 简洁性:代码实现简单,逻辑清晰。 

代码实现

#include <stdio.h>
#include <stdlib.h>int** fileCombination(int target, int* returnSize, int** returnColumnSizes) {// 初始化结果数组int** result = (int**)malloc(1000 * sizeof(int*));*returnColumnSizes = (int*)malloc(1000 * sizeof(int));*returnSize = 0;int left = 1, right = 1; // 窗口的起始和结束位置int sum = 0; // 窗口内文件编号的总和while (left <= target / 2) {if (sum < target) {// 总和小于 target,扩大窗口sum += right;right++;} else if (sum > target) {// 总和大于 target,缩小窗口sum -= left;left++;} else {// 找到符合条件的组合int* combination = (int*)malloc((right - left) * sizeof(int));for (int i = left; i < right; i++) {combination[i - left] = i;}(*returnColumnSizes)[*returnSize] = right - left;result[*returnSize] = combination;(*returnSize)++;// 移动左指针,继续寻找下一个组合sum -= left;left++;}}return result;
}int main() {int target = 15;int returnSize;int* returnColumnSizes;int** result = fileCombination(target, &returnSize, &returnColumnSizes);// 输出结果for (int i = 0; i < returnSize; i++) {for (int j = 0; j < returnColumnSizes[i]; j++) {printf("%d ", result[i][j]);}printf("\n");free(result[i]); // 释放每个组合的内存}// 释放结果数组和列大小数组free(result);free(returnColumnSizes);return 0;
}

代码解析

初始化

  • result 用于存储所有符合条件的组合。

  • returnColumnSizes 用于存储每个组合的大小。

  • returnSize 用于记录符合条件的组合数量。

滑动窗口逻辑

  • 使用 left 和 right 指针维护窗口的起始和结束位置。

  • 通过调整 left 和 right 指针,动态计算窗口内的总和。

记录结果

  • 当找到符合条件的组合时,将其存储在 result 数组中,并更新 returnColumnSizes 和 returnSize

内存管理

  • 在 main 函数中,释放动态分配的内存,避免内存泄漏。

复杂度分析

  • 时间复杂度:O(target)。由于我们最多遍历到 target / 2,因此时间复杂度为线性。

  • 空间复杂度:O(1)。除了存储结果的空间外,只使用了常数级别的额外空间。

总结

通过滑动窗口算法,我们可以高效地解决这个问题。滑动窗口的核心思想是通过动态调整窗口的大小,找到满足条件的连续子序列。这种方法不仅代码简洁,而且时间复杂度较低,非常适合处理类似的问题。

希望这篇博客对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


http://www.ppmy.cn/news/1568688.html

相关文章

【深度分析】DeepSeek 遭暴力破解,攻击 IP 均来自美国,造成影响有多大?有哪些好的防御措施?

技术铁幕下的暗战&#xff1a;当算力博弈演变为代码战争 一场针对中国AI独角兽的全球首例国家级密码爆破&#xff0c;揭开了数字时代技术博弈的残酷真相。DeepSeek服务器日志中持续跳动的美国IP地址&#xff0c;不仅是网络攻击的地理坐标&#xff0c;更是技术霸权对新兴挑战者的…

C#面试常考随笔8:using关键字有哪些用法?

1. using 指令&#xff1a;引入命名空间 最常用的用法。通过using 命名空间名字&#xff0c;可以在程序中直接使用该命名空间中的类型&#xff0c;而无需指定类型的完整命名空间路径。例如&#xff1a; using System; using System.Collections.Generic; class Program {sta…

Linux中 端口被占用如何解决

lsof命令查找 查找被占用端口 lsof -i :端口号 #示例 lsof -i :8080 lsof -i :3306 netstat命令查找 查找被占用端口 netstat -tuln | grep 端口号 #示例 netstat -tuln | grep 3306 netstat -tuln | grep 6379 ss命令查找 查找被占用端口 ss -tunlp | grep 端口号 #示例…

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…

论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅

1.论文链接&#xff1a;Modeling Linkage Disequilibrium and Performing Association Studies through Probabilistic Graphical Models: a Visiting Tour of Recent Advances 摘要&#xff1a; 本章对概率图模型&#xff08;PGMs&#xff09;的最新进展进行了深入的回顾&…

Linux---架构概览

一、Linux 架构分层的深度解析 1. 用户空间&#xff08;User Space&#xff09; 用户空间是应用程序运行的环境&#xff0c;与内核空间隔离&#xff0c;确保系统稳定性。 应用程序层&#xff1a; 用户程序&#xff1a;如 edge、vim&#xff0c;通过调用标准库&#xff08;如 …

将Deepseek接入本地Vscode

第一步&#xff1a;获取Deepseek APIKEY 1.1 登录Deepseek官网 https://www.deepseek.com/ 1.2 选择API开放平台 1.3 注册账号并登录 1.4 登录成功后的就界面 1.5 点击左侧菜单栏“API keys”&#xff0c;并创建API key 名称自定义输入 生成API key 复制保存&#xff0c;丢失…

《HelloGitHub》第 106 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…