今天学习的内容是 长度最小的子数组 、有序数组的平方,和螺旋矩阵
首先是加深对双指针法运用的学习
1. 长度最小的子数组
自己想到的解法和暴力算法相似,复杂度为O(n2),不能通过。
学习解法:滑动窗口
使用双指针,一个指向子数组的起点,一个指向子数组的终点。当窗口内元素和大于target时,移动窗口。相当于对每一个可能的子数组终点 j,移动数组起点 i去寻找一个可能存在的最小子数组,但是相比暴力算法,子数组的起点和长度变成了数组终点的一个属性,从而降低了复杂度。
题例: 209 长度最小的子数组; 904 水果成篮
2. 有序数组的平方
暴力算法,将数组的每个元素的平方赋给原元素,再使用快速排序sort()函数,sort(nums.begain,nums.end)即可。复杂度为O(n+nlogn)
使用双指针法:建一个新的数组copy(nums.size(),0),长度与nums相同所有元素为0。双指针分别指向nums的数组头和尾。非递减排序指的是存在相等值的由小到大的排序,考虑负数的存在,只需要考虑头和尾元素绝对值的大小,在进行比较后将较大的值从尾到头,即正序从小到大的顺序赋给创建的数组copy,然后根据比较的结果移动指针。
题例: 977 有序数组的平方
3. 螺旋矩阵
首先什么是螺旋矩阵,简单举例
[[1, 2, 3]
[8, 9, 4]
[7, 6, 5]]
这样即是恰如其名的螺旋矩阵。
总的来讲,绘制矩阵总共有四个方向需要考虑。
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
此外还需要考虑在n为奇数时,矩阵存在一个需要赋值的中心点。
所以需要四个循坏和一个if语句来解决这个问题。
题例: 59 螺旋矩阵
这类题目重在考察对过程的理解,需要考虑的要素很多,有些难度需要加强练习