4.有序数组的平方
暴力排序
可以用sort:nums.sort() 或 sorted() ,注意区别。
-
时间复杂度是 O(n + nlogn)
(代码图片传不上,算了)
双指针法 (前后指针)
注意到给的数组是按非递减顺序的已排序数组,数字有正有负,故平方后,两端较大,中间较小。
考虑双指针,比较前后两头的平方值。i指向起始位置,j指向终止位置。
定义一个新数组result,和原数组一样的大小,让k指向result数组终止位置。
注意:提前定义res列表!
时间复杂度为O(n)
5.长度最小的子数组
双指针法(滑动窗口)
此题巧妙处在于如何实现时间复杂度为O(n):通过每个元素只被遍历一次,即元素先通过右指针进一次,后通过左指针出一次。外层循环是右指针,指向子数组的终止位置,内层循环是左指针,指向起始位置。
另外注意,min_len通过min()的更新,curr_sum的累加,尤其注意不存在时返回0。
-
暴力解法时间复杂度:O(n^2)
-
滑动窗口时间复杂度:O(n)
暴力解法
通过2个for循环,力扣上超时了。时间复杂度是O(n^2)。
6.螺旋矩阵II
本题稍复杂,思路是:
-
从外层逐层填充,每层起始点的行数列数后移1,偏移量+1;
-
在每层中,4条边的边界条件注重循环不变量原则,即左闭右开,且保持不变;
-
另外注意在遍历时,行数列数分别的固定与变化情况;注意n为奇数时需填充中心点。
时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
空间复杂度 O(1)
耗时4h