先注声明:解题思路:借鉴、归纳及总结 意在记录学习过程(非原创)
但文字部分及所用图片均来自个人 谢绝转载
1.双指针法 LeetCode 977 977. 有序数组的平方 - 力扣(Leetcode)
标签:基于有序性,从数组两端收缩,免除排序
联想:合并两个有序链表大概也是类似的方法
注意事项:边界条件(例如取不取等)需要考虑清楚
总体代码很难出问题,但是需注意细节
2.滑动窗口 LeetCode209 209. 长度最小的子数组 - 力扣(Leetcode)
标签:连续子数组 长度最小
阐释:“窗口”是形象化的比喻,实质还是快慢指针的变种
在同一个数组上,经由两个指针进行操作,取中段作为不变量
tip: 连续是使用窗口的前提条件。
在满足判断[sum >= target] 后,计算长度 fast - slow +1,加1是细节问题。
result 的预设值很重要。一般找最小设最大INT_MAX,找最大设最小INT_MIN。
3.循环不变量 LeetCode 59 59. 螺旋矩阵 II - 力扣(Leetcode)
思路:破解循环:将旋转的每个过程剥离开 while里记叙一次循环的操作
确定不变量:每次循环的操作一致 循环中处理各边的原则一致(左闭右开)
补充:对于C语言解题,LeetCode给的参数着实有点难受。
对参数的处理更接近固定模板,指针分配内存,并无特殊的题目意义。
联想:其实面对这种旋转题,我的第一反应是模拟状态机进行状态转移。
但对于这道题,状态转移也是作为一个循环切入,并且每个状态的处理也都视为不变量。
换个角度说,状态机可能适用场景更广,毕竟状态之间的跳跃可以是无序的。
而这道题正是因为状态转移间的有序,使得可以借助顺序的for循环搭建。
如果用普通状态机,if 或switch 进行临界讨论和状态转移,理应可以完成。
但是细节判断上就比较琐碎,其处理难度上也会更大一些。
另外,本题解中以startx, starty作为起始位置控制量,减少了对下标 i 、j的讨论。
以循环外变量控循环内变量,坦白讲这是非常值得借鉴的技巧。