天天看点

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

一、997有序数组的平方

1、法一(直接排序)

这个题先按自己的思路写了一下,不过是直接用的具体例子,没有想到能用双指针的方法,用的就是最普通的遍历和排序,如下图

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

 后来看力扣官网给出的解答,发现这种方法可以用更简单的写法来写,确实精简了很多,一行代码即可完成

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

2、法二(双指针法)

卡哥版:(这个好这个好,看这个!)

为什么会想到双指针法呢?首先这是个有序数组,但是有正数负数之分,所以平方之后最大值一定在两边,越往中间的部分越小,故可以考虑双指针法,i指向起始位置,j指向终止位置。

用两个指针分别指向位置 00 和 n-1n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况。

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

 这里需要注意ans = [-1]*n,联系到昨天学过的数组的知识点,用替代的方法将新元素写入数组中

力扣版:(不喜欢这个!)

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II
代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

 二、209长度最小的子数组

滑动窗口法解决,本质上也是双指针法,核心在于动态调整子序列的起始位置

卡哥写法:

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

力扣写法:

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

最后一行的简化写法可以学习一下

三、59螺旋矩阵II

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

力扣官方题解削微有点难理解,不贴了就。主要思想就是统一成左闭右开的区间,不要有重复元素,一圈一圈遍历,然后放入nums中。 

手撕代码,以n=3和n=4为例:

说白了中间的四个for循环就是正方形的四条边上的元素,最外面的for循环是一共有几层的那个层数。手写一遍之后思路清晰了许多~

n=3: 

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

 n=4:

代码随想录算法训练营day2 | 977有序数组的平方 | 209长度最小的子数组 | 59螺旋矩阵II一、997有序数组的平方 二、209长度最小的子数组三、59螺旋矩阵II

继续阅读