1、977.有序数组的平方
思路
这道题也是有序的,关键点是平方后两边大中间小
首尾各设置一个指针,依次找出较大值并向中间遍历。
此题可以用一个新数组,时间复杂度为O(n)
困难
1、循环条件是直到左右指针重合(left<=right)
总结/笔记
Python 中可以使用以下方法来创建长度为n的list:
1、使用range()和list()函数: list(range(n))
2、使用[None] * n 表达式
3、使用 list comprehension 表达式 [0 for _ in range(n)]
4、利用 *n 列表解析语法,如 [0]*n,[float(‘inf’)]*len(nums)
Python中的平方/平方根:
1、a ** 2; a ** 0.5
2、import math
math.pow(12, 2)
math.sqrt(12)
3、内置函数pow(12,2) pow(12,0.5)
2、209长度最小的子数组
思路
常见的是暴力破解,复杂度为O(n^2),会超时
本题引入滑动窗口的概念,确定首尾,算出长度。O(n)
困难
1、以什么为循环结束的标志?
若以左边界为循环结束的标志,右边界还是要依次遍历
以右边界为循环结束(第一个while)的标志,并确定左边界的位置
2、怎么确定首尾的位置?区分区间是否有效。
若sum大于等于target,算有效区间,就要计算窗口长度,并且缩小左边界,直到成为无效区间为止,这里又引入了一个while。
有效区间缩小左边界,无效区间扩大右边界!
总结/笔记
1、要找最小值,就要先设定一个最大值result = float(‘inf’),用min不断更新最小值,返回时也要判断return result if result!=float(‘inf’) else 0
2、不要以为while里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。
3、59.螺旋矩阵
思路
困难
1、循环条件是什么?是所有数字还是转几圈?找重复动作,转一圈是一个重复动作,以它为循环,循环的起点就是(0,0)、(1,1)…
先计算出转几圈loop=n//2,每一圈偏移量offset从1开始
2、依次上下左右转圈,更新起始位置、偏移量
总结/笔记
1、创建二维数组matrix = [ ( [0] * n ) for t in range(n) ]