当前位置: 首页 > news >正文

【LeetCode题解】LeetCode 209. 长度最小的子数组

【题目链接】
209. 长度最小的子数组
【题目描述】
在这里插入图片描述
【题解】

方法一:滑动窗口

本题可以使用双指针算法,定义两个指针lr分别表示子数组的开始位置和起始位置,sum数组存储的从l到r区间内所有元素的和。初始状态下,lr都指向下标0sum的值为0
每一轮迭代,将nums[r]添加到sum中,如果sum≥target,则更新子数组的最小长度,此时的最小长度为r-l+1,然后将nums[l]sum中减去并将l右移,直到sum<target,在这个过程中同样需要更新子数组的最小长度。
在每一轮迭代后,将r右移。
【AC代码】

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int l = 0, r = 0, n = nums.size();int sum = 0, res = 1e9;while(r < n) {sum += nums[r];while(sum >= target) {res = min(res, r - l + 1);sum -= nums[l];l++;}r++;}if(res == 1e9)return 0;return res;}
};

方法二:前缀和+二分查找

阅读题目可以发现,其中出现了子数组的和,而前缀和算法可以在常数时间内通过前缀和数组计算任意区间的和,避免重复计算,从而提高查询效率。同时,这道题保证了数组中每个元素都为正,所以前缀和一定是递增的,这一点保证了二分的正确性。如果题目没有说明数组中每个元素都为正,这里就不能使用二分来查找这个位置了
为了使用二分查找,需要额外创建一个数组sums用于存储数组nums的前缀和,其中sums[i]表示从nums[0]nums[i−1]的元素和。得到前缀和之后,对于每个开始下标i,可通过二分查找得到大于或等于i的最小下标left,使得sums[left]−sums[i−1]≥target,并更新子数组的最小长度(此时子数组的长度是left−(i−1))。由于二分查找的终止条件是left==right,因此此处找到的最小下标为right或者left
【AC代码】

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();if (n == 0) return 0;int res = 1e9;vector<int> sums(n + 1, 0);for (int i = 1; i <= n; ++i) {sums[i] = sums[i - 1] + nums[i - 1];}// 提前判断整个数组和是否小于target,直接返回0if (sums[n] < target)return 0;for (int i = 1; i <= n; i++) {int left = i, right = n;while (left < right) {int mid = left + right >> 1;if (sums[mid] - sums[i - 1] >= target) {right = mid;} else {left = mid + 1;}}// 检查left是否有效,且对应的和满足条件if (left <= n && sums[left] - sums[i - 1] >= target) {res = min(res, left - i + 1);}}return res == 1e9 ? 0 : res;}
};

【思考&收获】
1.阅读题目,题目要求的是大于等于target的数组,第一次读题的时候看成了等于target,卡住了一段时间。
2.数组中每个元素都为正,则前缀和一定是递增的,这一点保证了二分的正确性,可以考虑使用二分查找。

http://www.lryc.cn/news/626752.html

相关文章:

  • 机器学习-数据预处理全指南:从缺失值到特征编码
  • 如何选择汽车ECU的加密方法
  • ROS2核心模块
  • Nik Collection 6.2全新版Nik降噪锐化调色PS/LR插件
  • CreateRef和useRef
  • Java内功修炼(2)——线程安全三剑客:synchronized、volatile与wait/notify
  • Web前端调试与性能优化,Charles抓包工具的高效应用
  • YOLOv11 到 C++ 落地全流程:ONNX 导出、NMS 判别与推理实战
  • Vue透传 Attributes(详细解析)2
  • 极其简单二叉树遍历JAVA版本
  • CMake1:概述
  • 查看磁盘占用情况和目录大小
  • 企业架构及战略价值
  • 如何让FastAPI任务系统在失败时自动告警并自我修复?
  • 从零实现自定义顺序表:万字详解 + 完整源码 + 图文分析
  • 从“怀疑作弊”到“实锤取证”:在线面试智能监考重塑招聘公信力
  • 河南萌新联赛2025第六场 - 郑州大学
  • 数据库优化提速(一)之进销存库存管理—仙盟创梦IDE
  • 开源模型应用落地-安全合规篇-深度合成隐式标识的技术实现(五)
  • 无人机感知系统详解
  • Tomcat 性能优化终极指南
  • C++ std::sort的应用总结
  • Vue2封装Axios
  • Google Chrome v139.0.7258.139 便携增强版
  • 嵌入式音频开发(3)- AudioService核心功能
  • 嵌入式开发学习———Linux环境下网络编程学习(四)
  • 04-认证授权服务开发指南
  • 读《精益数据分析》:规模化(Scale)—— 复制成功,进军新市场
  • Kafka如何保证消费确认与顺序消费?
  • Python爬虫实战:研究dark-fantasy,构建奇幻文学数据采集分析系统