天天看點

代碼随想錄算法訓練營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

繼續閱讀