一、有序数组的平方
一开始思路肯定是暴力解法,所有数字先平方,后排序,但是导致复杂度增加。数组的数据有负数和正数,因此平方后,最大值一定是在两端,可以考虑双指针,思路如下:
setp1:首先找到两端数,先平方,再比较,最大那个数,填入新的数组最后位置,如果是最右边指针指向的平方数大于左边的平方数,那么右指针减1,否则左指针加1;
step2:直到left <=right;
二、长度最小的子数组
最开始做的时候,也是用暴力解法,通过遍历找到所有的情况,这样等到最小值,但是计算复杂度高,学习代码随想录上面(链接:代码随想录),使用滑动窗口方法,学习过程中,针对该方法,最核心的点是怎么处理头窗口的移动,例如本题目,每一次累加和大于目标值,就需要更新头窗口,并把每一次最小的长度记录下来。
三、螺旋矩阵
这道题目需要考虑细节特别多,最主要还是区间封闭选择,是左闭右开,还是左开右闭,当每一次遍历矩阵时候,需要遵循此原则,才能不重复和不遗漏。做题目时候,需要考虑以下几点:
1 循环次数,即循环几圈;
2 偏移量,每一次循环后,边界都有偏移;
3 起始位置,需要考虑x y方向起始位置;
4 奇数和偶数矩阵不同,奇数最后是中间一个,需要单独考虑。
以下是code: