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

一、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:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值