代码随想录算法训练营第2天 | 977有序数组的平方、209长度最小的子数组、59螺旋矩阵II

1、977.有序数组的平方

文档讲解: 有序数组的平方
视频讲解:有序数组的平方
状态:了解思路后AC

思路

这道题也是有序的,关键点是平方后两边大中间小
首尾各设置一个指针,依次找出较大值并向中间遍历。
此题可以用一个新数组,时间复杂度为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长度最小的子数组

文档讲解: 长度最小的子数组
视频讲解:长度最小的子数组
状态:看讲解后AC

思路

常见的是暴力破解,复杂度为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.螺旋矩阵

文档讲解: 螺旋矩阵
视频讲解:螺旋矩阵
状态:看讲解后AC

思路
困难

1、循环条件是什么?是所有数字还是转几圈?找重复动作,转一圈是一个重复动作,以它为循环,循环的起点就是(0,0)、(1,1)…
先计算出转几圈loop=n//2,每一圈偏移量offset从1开始
2、依次上下左右转圈,更新起始位置、偏移量

总结/笔记

1、创建二维数组matrix = [ ( [0] * n ) for t in range(n) ]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值