LeetCode刷题记录 | 长度最小的子数组 螺旋矩阵II
📝 前言
今天继续我的LeetCode刷题之旅,完成了两道经典算法题。这两道题分别考查了滑动窗口和矩阵操作的核心思想,让我对算法有了更深入的理解。
🎯 题目一:209. 长度最小的子数组
📋 题目描述
给定一个含有 n
个正整数的数组和一个正整数 target
,找出该数组中满足其和 ≥ target
的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
题目链接: LeetCode 209
💡 解题思路
这道题是典型的滑动窗口问题。我的解题思路如下:
- 双指针技巧: 使用左右两个指针维护一个滑动窗口
- 窗口扩展: 右指针不断向右移动,扩大窗口,累加元素值
- 窗口收缩: 当窗口内元素和 ≥ target时,尝试移动左指针收缩窗口
- 记录最小长度: 在满足条件的情况下,不断更新最小长度
🔧 代码实现
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
💡 解题思路
这道题考查的是矩阵边界控制和方向转换:
- 边界定义: 定义上下左右四个边界
- 方向控制: 按照右→下→左→上的顺序填充
- 边界更新: 每完成一个方向的填充,相应更新边界
- 终止条件: 当所有位置都被填充完毕时结束
🔧 代码实现
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) - 除了结果矩阵外,只使用常数空间
🤔 个人思考
这道题最容易出错的地方是边界条件的处理。我在第一次实现时忘记了在填充下边界和左边界时检查边界是否还有效,导致了重复填充。通过仔细分析边界变化规律,最终解决了这个问题。
🎯 今日收获
- 滑动窗口模板: 掌握了滑动窗口的标准写法,可以应用到更多子数组问题
- 矩阵操作技巧: 学会了如何优雅地处理矩阵边界和方向转换
- 边界条件思考: 提高了对边界条件的敏感度,减少了bug产生
🔄 算法模式总结
算法模式 | 适用场景 | 时间复杂度 | 关键点 |
---|---|---|---|
滑动窗口 | 连续子数组问题 | O(n) | 双指针 + 窗口伸缩 |
矩阵遍历 | 二维数组操作 | O(n²) | 边界控制 + 方向转换 |
🔗 参考资料
- LeetCode 209 题目链接
- LeetCode 59 题目链接
- 代码随想录 - 滑动窗口详解
- 代码随想录 - 螺旋矩阵详解
💪 坚持刷题,持续进步!
如果这篇文章对你有帮助,请点赞支持一下~ 🌟