文章目录
- 一、有序数组的平方:力扣977
- 二、长度最小的数组:力扣209
- 三、螺旋矩阵II:力扣59
- 总结
前言
每日刷题,从已做起。
一、有序数组的平方
针对平方过后的数组会出现非有序的情况。重点理解“双指针法”,通过构建新的数组(构建任意占字符的数组如:result=[-1] * n;即为n个-1的重复数组),将左右指针的数组数值对比大小,大的进入新的数组中,
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
i, j, k = 0, n-1, n-1
result = [-1] * n #构建全为-1的占位符数组
while i <= j:
left = nums[i] ** 2
right = nums[j] ** 2
if left > right:
result[k] = left
i += 1
else:
result[k] = right
j -= 1
k -= 1
return result
二、长度最小的数组
学会基本的构建最大值方法,理解双指针中i与j变量的使用顺序,对j先行遍历可实现后续i的动态变化。对比左右指针间的和与目标值的大小,找出长度最小的数组。如果未找到i,j继续增大,则总和要减去之前的初始值。
代码如下(示例):
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
i = 0 #滑动窗口的起始位置
maxist = float("inf") #构建最大值方法
sum = 0 #连续子数组和
for j in range(len(nums)): #遍历终止节点j到整个数组长度
sum += nums[j] #更新连续子数组和
while sum >= target: #判断和
maxist = min(maxist, j - i + 1)
sum -= nums[i]
i += 1
if maxist == float("inf"):
return 0
else:
return maxist
三、螺旋矩阵长度最小的数组
最重要一点是保持每一轮的遍历节点方式统一,比如左闭右开保持在正方形四条边上均统一使用。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)] #设nums为n阶0元素矩阵进行遍历
sx, sy = 0, 0 #矩阵起始点
loop, mid = n // 2, n // 2 #迭代次数,当n为基数则最后的中间点为nums[i][j]
count = 1 #计数
for offset in range(1, loop + 1): #圈数offset从1开始
for j in range(sy, n - offset): #遍历从左到右
nums[sx][j] = count
count += 1
for i in range(sx, n - offset): #遍历从上到下
nums[i][n - offset] = count
count += 1
for j in range(n - offset, sy, -1): #遍历从右到左
nums[n - offset][j] = count
count += 1
for i in range(n - offset, sx, -1): #遍历从下到上
nums[i][sy] = count
count += 1
sx += 1 #循环进一层,起始点均+1
sy += 1
if n % 2 != 0: #n为基数时
nums[i][j] = count
return nums
总结
以上就是今天所学的内容,再次巩固Python相关语法使用,比如创建具有相同占位符的数组、如何实现对任意变量进行遍历。