一、997有序数组的平方
1、法一(直接排序)
这个题先按自己的思路写了一下,不过是直接用的具体例子,没有想到能用双指针的方法,用的就是最普通的遍历和排序,如下图
后来看力扣官网给出的解答,发现这种方法可以用更简单的写法来写,确实精简了很多,一行代码即可完成
2、法二(双指针法)
卡哥版:(这个好这个好,看这个!)
为什么会想到双指针法呢?首先这是个有序数组,但是有正数负数之分,所以平方之后最大值一定在两边,越往中间的部分越小,故可以考虑双指针法,i指向起始位置,j指向终止位置。
用两个指针分别指向位置 00 和 n-1n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况。
这里需要注意ans = [-1]*n,联系到昨天学过的数组的知识点,用替代的方法将新元素写入数组中
力扣版:(不喜欢这个!)
二、209长度最小的子数组
滑动窗口法解决,本质上也是双指针法,核心在于动态调整子序列的起始位置
卡哥写法:
力扣写法:
最后一行的简化写法可以学习一下
三、59螺旋矩阵II
力扣官方题解削微有点难理解,不贴了就。主要思想就是统一成左闭右开的区间,不要有重复元素,一圈一圈遍历,然后放入nums中。
手撕代码,以n=3和n=4为例:
说白了中间的四个for循环就是正方形的四条边上的元素,最外面的for循环是一共有几层的那个层数。手写一遍之后思路清晰了许多~
n=3:
n=4: