第二天打卡,题目单静静躺在收藏夹里:209.长度最小的子数组、59.螺旋矩阵II。第一天刚被704二分查找和27移除元素虐过,我以为第二天就算不上新知识点,至少也该进入链表或者哈希表,结果一看还是数组。说句实话,我心里甚至有点轻敌,觉得“数组这章还能翻出什么花来”。
然后两道题加起来耗了我整整三个多小时。209卡在“while写成了if”这种看似弱智的问题上,59螺旋矩阵II更是被n=3的边界绕得团团转。等终于AC完再回头看代码随想录的题解,才发现这两道题放在第二天不是没道理的:滑动窗口是双指针思想的延伸,螺旋矩阵则是“模拟类题目”的入门代表。
这篇文章我把自己的完整复盘写下来,包括暴力思路为什么不行、滑动窗口为什么能行、螺旋矩阵的边界条件怎么才能不靠玄学写对,以及我在本地调试时打印出来的那些坑。如果你正在跟代码随想录打卡、准备面试刷题,或者单纯被数组题折磨到怀疑人生,这篇就当一份排雷笔记看吧。
1. 两道题的正确打开方式:先搞清楚“考点”再动手
1.1 209题考核的是什么
209题全称是“长度最小的子数组”,LeetCode原题,题面很简单:给定一个含有 n 个正整数的数组和一个正整数 target,找出该数组中满足其和大于等于 target 的长度最小的连续子数组,并返回其长度;如果不存在符合条件的子数组,返回0。
这里有两个关键词值得圈出来:第一是“连续”,第二是“正整数”。
连续意味着我们不能对数组排序,排序会直接破坏子数组的连续性。很多第一次做这题的人第一反应是“窗口固定长度挨个滑一下”,或者是“双指针往中间夹逼”,但真正走通之后会发现,正确解法其实是双指针里面更进阶的一种形态——滑动窗口。
为什么说它进阶?因为传统双指针通常是比较两个独立指针对应的值,而滑动窗口是把 right 指针不断向右扩张,把 left 指针按需向右收缩,整个窗口维护的是“当前这一段连续子数组的和”。我在第一天做27移除元素时已经用过双指针,那是一种“快指针找目标、慢指针写结果”的结构,到了209这里则是“right负责扩张、left负责收缩”,两种双指针的移动逻辑完全不一样。
1.2 59题考核的是什么
59螺旋矩阵II同样来自LeetCode:给定一个正整数 n,生成一个包含 1 到 n² 所有元素的 n x n 正方形矩阵,元素按顺
