第一个冲到脑袋里的想法就是把原数组直接相乘, 最后一个sort,完事儿!
但是事情肯定不会这么简单,如果有follow-up,把复杂度降低到O(N), 也就是说希望遍历一遍就能算出答案,数组的常用技巧就是双指针,于是乎我顺着常理去想,如何找到最小值呢? 答: 遍历一遍,记录最小值和Index. 之后在这里为界向两边扩展,一边相比一边移动指针知道结束。
写完之后,得意地去看答案发现更巧妙地思路就是可以从最大值开始赋值!这样就避免了先遍历一边去找最小值的麻烦。
很巧妙丫!
209.长度最小的子数组
这一类需要保存连续子数组的题目,一看就有种滑动窗口的既视感。
对于滑动窗口,我自己的理解是一共分3步:
1: 开始移动右指针扩窗口,更新自己需要计算的变量。
2:判定什么情况下需要缩窗口了,开始缩小,同时更新窗口内部的变量。
3:在窗口满足条件的时候,计算答案
对于如何debug, 我也是正在一步步探索最适合自己的debug 模板, 现在我采用了别人的建议,打出更改后的left, right 下标,看窗口是不是按照我自己的想法进行移动。如果是的,再去看自己的答案计算是不是公式错误,或者再错误的位置进行计算。
59.螺旋矩阵II
看了一些题解,对二维数组有了更多的理解。
这道题,并不需要一些特殊的技巧,只要按照题目要求的顺序一个个把num放入到自己建立好的空数组即可。
而在遍历过程中,要记住的是:我们只要到一个boundary(无论上下还是左右)就意味着有一行或者一列已经被填满了,这样我们需要一个var去记录才能在下次遍历的时候不会又遍历回去。
所以我创建了4个boundary 变量,每次遍历赋值之后,就一定会更新其中一个变量的值。
最后完成所有赋值输出。