02天【代码随想录算法训练营34期】 第一章 数组part02 ( 977.有序数组的平方 、209.长度最小的子数组、 59.螺旋矩阵II)
977.有序数组的平方
暴力解法,熟悉python的array.sort()用法
- 可以再温习一下不同sort的算法写法以及complexity
class Solution(object):
def sortedSquares(self, nums):
for i in range(len(nums)):
nums[i] = nums[i] ** 2
nums.sort()
return nums
双指针解法
class Solution(object):
def sortedSquares(self, nums):
left_ptr = 0
right_ptr = len(nums) - 1
result = [0] * len(nums)
write_ptr = len(nums) - 1
left_sqr = nums[left_ptr] ** 2
right_sqr = nums[right_ptr] ** 2
while write_ptr >= 0:
if left_sqr > right_sqr:
result[write_ptr] = left_sqr
left_ptr += 1
left_sqr = nums[left_ptr] ** 2
else:
result[write_ptr] = right_sqr
right_ptr -= 1
right_sqr = nums[right_ptr] ** 2
write_ptr -= 1
return result
209.长度最小的子数组
滑动窗口,也属于双指针,窗口右边递增,每次递增遍历一下窗口左边递增的情况
class Solution(object):
def minSubArrayLen(self, target, nums):
window_start = 0
min_size = float('inf')
summation = 0
for window_end, number in enumerate(nums):
summation += number
while summation >= target:
min_size = min(min_size, window_end - window_start + 1)
summation -= nums[window_start]
window_start += 1
if min_size == float('inf'):
return 0
else:
return min_size
59.螺旋矩阵II
怎么决定转几圈?把矩阵上下割开,有几层就转几圈
class Solution(object):
def generateMatrix(self, n):
startx, starty = 0, 0 #每一圈的初始点
matrix = [[0] * n for _ in range(n)] #做个矩形框框出来
layer = 1 #第几圈
count = 1 #数数
mid = n // 2 #一共转几圈
for k in range(mid):
for j in range(starty, n - layer): #从左上到右上的前一格
matrix[startx][j] = count
count += 1
for i in range(startx, n - layer): #从右上到右下的前一格
matrix[i][n - layer] = count
count += 1
for j in range(n - layer, starty,-1): #从右下到左下的前一格
matrix[n - layer][j] = count
count += 1
for i in range(n - layer, startx, -1): #从左下到左上的前一格子
matrix[i][starty] = count
count += 1
startx += 1
starty += 1
layer += 1
if n % 2 != 0: #如果n为奇数的话,中间会留个芯,填进去
matrix[mid][mid] = count
return matrix