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

LeetCode刷题记录 | 长度最小的子数组 螺旋矩阵II

📝 前言

今天继续我的LeetCode刷题之旅,完成了两道经典算法题。这两道题分别考查了滑动窗口矩阵操作的核心思想,让我对算法有了更深入的理解。


🎯 题目一:209. 长度最小的子数组

📋 题目描述

给定一个含有 n 个正整数的数组和一个正整数 target,找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

题目链接: LeetCode 209

💡 解题思路

这道题是典型的滑动窗口问题。我的解题思路如下:

  1. 双指针技巧: 使用左右两个指针维护一个滑动窗口
  2. 窗口扩展: 右指针不断向右移动,扩大窗口,累加元素值
  3. 窗口收缩: 当窗口内元素和 ≥ target时,尝试移动左指针收缩窗口
  4. 记录最小长度: 在满足条件的情况下,不断更新最小长度

🔧 代码实现

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int left = 0, right = 0;int sum = 0;int minLen = INT_MAX;while (right < n) {// 扩展窗口sum += nums[right];// 收缩窗口while (sum >= target) {minLen = min(minLen, right - left + 1);sum -= nums[left];left++;}right++;}return minLen == INT_MAX ? 0 : minLen;}
};

📊 复杂度分析

  • 时间复杂度: O(n) - 每个元素最多被访问两次
  • 空间复杂度: O(1) - 只使用了常数级额外空间

🤔 个人思考

刚开始我想到的是暴力解法,但时间复杂度是O(n²)。通过学习滑动窗口技巧,我意识到很多子数组问题都可以用这种方法优化。关键在于理解什么时候扩展窗口,什么时候收缩窗口。


🎯 题目二:59. 螺旋矩阵II

在这里插入图片描述

📋 题目描述

给你一个正整数 n,生成一个包含 1 到 n² 所有元素,且元素按顺时针顺序螺旋排列的 n × n 正方形矩阵。

题目链接: LeetCode 59

💡 解题思路

这道题考查的是矩阵边界控制方向转换

  1. 边界定义: 定义上下左右四个边界
  2. 方向控制: 按照右→下→左→上的顺序填充
  3. 边界更新: 每完成一个方向的填充,相应更新边界
  4. 终止条件: 当所有位置都被填充完毕时结束

🔧 代码实现

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> matrix(n, vector<int>(n, 0));int top = 0, bottom = n - 1;int left = 0, right = n - 1;int num = 1;while (top <= bottom && left <= right) {// 从左到右填充上边界for (int j = left; j <= right; j++) {matrix[top][j] = num++;}top++;// 从上到下填充右边界for (int i = top; i <= bottom; i++) {matrix[i][right] = num++;}right--;// 从右到左填充下边界if (top <= bottom) {for (int j = right; j >= left; j--) {matrix[bottom][j] = num++;}bottom--;}// 从下到上填充左边界if (left <= right) {for (int i = bottom; i >= top; i--) {matrix[i][left] = num++;}left++;}}return matrix;}
};

📊 复杂度分析

  • 时间复杂度: O(n²) - 需要填充n²个位置
  • 空间复杂度: O(1) - 除了结果矩阵外,只使用常数空间

🤔 个人思考

这道题最容易出错的地方是边界条件的处理。我在第一次实现时忘记了在填充下边界和左边界时检查边界是否还有效,导致了重复填充。通过仔细分析边界变化规律,最终解决了这个问题。


🎯 今日收获

  1. 滑动窗口模板: 掌握了滑动窗口的标准写法,可以应用到更多子数组问题
  2. 矩阵操作技巧: 学会了如何优雅地处理矩阵边界和方向转换
  3. 边界条件思考: 提高了对边界条件的敏感度,减少了bug产生

🔄 算法模式总结

算法模式适用场景时间复杂度关键点
滑动窗口连续子数组问题O(n)双指针 + 窗口伸缩
矩阵遍历二维数组操作O(n²)边界控制 + 方向转换

🔗 参考资料

  • LeetCode 209 题目链接
  • LeetCode 59 题目链接
  • 代码随想录 - 滑动窗口详解
  • 代码随想录 - 螺旋矩阵详解

💪 坚持刷题,持续进步!
如果这篇文章对你有帮助,请点赞支持一下~ 🌟

http://www.dtcms.com/a/351628.html

相关文章:

  • curl get post
  • GPMall 项目单机部署全流程GPMall:Redis、MariaDB、Kafka、Nginx 一步到位
  • Java微服务AI集成指南:LangChain4j vs SpringAI
  • 在线教育系统源码助力教培转型:知识付费平台开发的商业实践
  • Hyperledger Fabric官方中文教程-改进笔记(十七)-编写第一个链码
  • 售价2.5 万元的 Jetson Thor,能否开启人形机器人商业化新局面?
  • 利用AI进行ArcGISPro进行数据库的相关处理?
  • 如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物的影响?
  • ROS2一键安装脚本:ROS2安装教程,快速搭建开发环境
  • 请求接口302 Moved Temporarily
  • 【数据价值化】数据资产入表指南:核心准则与实操路径
  • C语音初阶————指针2
  • .NET 6.0 日志处理之Serilog 写入到sql server(一)
  • OOM问题排查思路及解决方案
  • 【Notepad++免费版下载安装教程(附安装包)2025最新整理】
  • 如何用Wireshark捕获当前房间路由器和主机的数据包
  • iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持
  • 剖析graph-rag中最核心的一步:切片文本如何输入到大模型并且构建整体的关系
  • 食用油平台:油香里的生活哲学课
  • 使用 Vue 3 <script setup> 语法实现基于 token 的登录功能
  • 100种交易系统(4)顺势回调开仓
  • android多线程与线程间通信
  • python-多线程(笔记)(持续更新)
  • 基于dify+ollama+bge组合搭建本地知识库
  • 10分钟快速搭建 SkyWalking 服务
  • 【Apache MXNet】
  • Med-SA 论文总结
  • Apache Shiro基本使用指南
  • 基于SpringBoot的社团管理系统【2026最新】
  • 《C++ Primer 第五版》initializer_list 涉及到的范围 for 循环(range-based for) 的语义差别