977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
建议大家先独立做题,然后看视频讲解,然后看文章讲解,然后在重新做一遍题,把题目AC,最后整理成今日当天的博客
拓展题目可以先不做
977.有序数组的平方 +双指针
题目建议: 本题关键在于理解双指针思想
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html 视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep
- 数组形式:非递减(有序可重复)
- 要求:时间复杂度O(n)
- 两种方法:暴力解法+双指针
- 暴力解法:需要结合排序算法,不满足时间复杂度要求
- 双指针:其实有三个指针,两个指向原始数组的首尾,一个指向新数组的“最后”(即插入“最大值”的位置)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left, right, insert = 0, len(nums)-1, len(nums)-1 # 三个指针
res = [float('inf')] * len(nums)
while left <= right:
if nums[left] ** 2 < nums[right] **2:
res[insert] = nums[right] ** 2
right -= 1
else:
res[insert] = nums[left] ** 2
left += 1
insert -= 1
return res
注意其中python代码的写作:
- 列表初始化:[float(‘inf’)] * len(nums) 这里取什么值没关系,主要还是为了防止越界访问吧
- 平方的计算
双指针什么时候使用
- 一般要求O(n)或者原地修改可以考虑双指针
209.长度最小的子数组+滑动窗口
题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
- 数组形式:不重要
- 思路关键:连续子数组
- 关键要求:如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法
- 解法:滑动窗口(也是双指针)
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
size = len(nums)
left, right = 0, 0
min_len = float('inf')
cum_sum = 0
while right < size:
cum_sum += nums[right]
while cum_sum >= target:
min_len = min(min_len, right-left + 1)
cum_sum -= nums[left]
left += 1
right += 1
return min_len if min_len != float('inf') else 0
59.螺旋矩阵II
题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
- 由一个整数生成数组
- 关键点:厘清每次不变的量,定义好边界点
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
loop, mid = n//2, n//2
start_x, start_y = 0,0
count = 1
res = [[0]*n for _ in range(n)]
for offset in range(1, loop+1):
for i in range(start_y, n-offset): #从左至右
res[start_x][i] = count
count += 1
for i in range(start_x, n-offset): #从上至下
res[i][n-offset] = count
count += 1
for i in range(n-offset,start_y,-1): #从右至左
res[n-offset][i] = count
count += 1
for i in range(n-offset,start_x,-1): #从上至下
res[i][start_y] = count
count += 1
start_x += 1
start_y += 1
if n%2 != 0:
res[mid][mid] = n**2
return res
python代码书写注意:
- 初始化二维列表的方式 https://blog.csdn.net/qdPython/article/details/127771793
总结
题目建议:希望大家 也做一个自己 对数组专题的总结
文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E6%80%BB%E7%BB%93%E7%AF%87.html