Leetcode977、有序数组的平方
初始想法
将数组中的每个数都平方后再做排序。排序使用最快的快速排序的方法。
局限性:题目要求时间复杂度为,但是快速排序的时间复杂度为
双指针法
因为绝对值最大(也是平方后最大)的数都处于数组的两端,并向中间依次减小,所以可以使用双指针从首尾分别开始,比较两边平方后的大小后再加入新的数组中。这样时间复杂度为
Leetcode209、长度最小的子数组
初始想法
使用两个for循环,第一个for循环找数组的起始位置,第二个for循环找数组的终止位置。相当于遍历完所有子数组后再做比较,时间过长,时间复杂度为。
滑动窗口法
其实也是一种双指针法。
一个指针j记录终止位置:遍历数组(最外层for循环)
一个指针i记录起始位置:如果当前窗口的值之和大于s,窗口向前移动(i向后移),内层while循环
如果当前子数组的长度小于之前所记录的最小子数组长度,更新长度
时间复杂度:O(n)
空间复杂度:O(1)
Leetcode59、螺旋矩阵2
模拟顺时针画矩阵的过程:
上行左到右
右列上到下
下行右到左
左列下到上
在很多的边界条件时要遵循循环不变量原则,每画一条边都遵循左闭右开(将拐角处留给新的一条边来画)
如果是遵循左闭右闭的情况,那么后一条画的边会覆盖前一条的拐角处
时间复杂度:O(n2),模拟遍历二维矩阵的时间
空间复杂度:O(1)