代码随想录算法训练营|977.有序数组的平方; 209.长度最小的子数组; 59.螺旋矩阵II
977.有序数组的平方
题目链接: 977.有序数组的平方
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:简单
思路:考虑双指针的思想。左指针和右指针分别从两边开始遍历,大的值放在新数组最后面。
时间复杂度:O(log(n));空间复杂度:O(n)
下面展示 代码
:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left = 0
right = len(nums) - 1
res = [0] * len(nums)
for k in range(len(nums), 0, -1):
if nums[left]**2 < nums[right]**2:
# 右边的平方大,右指针-1,左指针不变
res[k-1] = nums[right]**2
right -= 1
else:
# 左边的平方大,左指针+1,右指针不变
res[k-1] = nums[left]**2
left += 1
return res
209.长度最小的子数组
题目链接: 209.长度最小的子数组
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:中等
思路:双指针法(滑动窗口): 左指针和右指针组成滑动窗口,每次满足窗口的和满足要求(大于等于target)时,记录窗口长度,找到最小的窗口
时间复杂度:O(n);空间复杂度:O(1)
代码
如下
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left, right = 0, 0
length = len(nums)
res = float('Inf')
summ = 0
while right < length:
summ += nums[right]
while summ >= target:
res = min(res, right - left + 1)
summ -= nums[left]
left += 1
right += 1
return res if res != float('Inf') else 0
59.螺旋矩阵II
题目链接: 59.螺旋矩阵II
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:中等
思路:注意区间,如果选择左开右闭就一直保持左开右闭
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
时间复杂度:O(n^2)
acm模式代码
如下
# 输入输出版
def generateMatrix(n: int):
# 利用二分法的左闭右开进行矩阵填充
res = [[0]*n for i in range(n)]
loop = n // 2
count = 1
start = 0
for circle in range(1, loop + 1):
# 从左到右,左闭右开
for i in range(start, n - circle):
res[start][i] = count
count += 1
# 从上到下,左闭右开
for i in range(start, n - circle):
res[i][n-circle] = count
count += 1
# 从右到左,左闭右开
for i in range(n - circle, start, -1):
res[n-circle][i] = count
count += 1
# 从下到上,左闭右开
for i in range(n - circle, start, -1):
res[i][start] = count
count += 1
# loop结束
start += 1
if n % 2 == 0:
print(res)
else:
res[n//2][n//2] = count
print(res)
n = int(input())
generateMatrix(n)