Python - 代码随想录训练营第二天|977. 有序数组的平方209. 长度最小的子数组59. 螺旋矩阵 II
前言
如题目所示,简单记录
今日练习
977. 有序数组的平方
一开始想着暴力,但太麻烦了,后来想用双指针,写出来了三方交换,也很奇怪。观看视频后,新的数组设立了一个新空间,而不是在原来基础上存放。
代码
:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
nums[i] = nums[i] * nums[i]
renum = [0]*len(nums) #存放目标数组
k = len(nums) - 1
left = 0
right = len(nums) - 1
while left <= right: #如果没有等于会丢掉最后相等时的数
if nums[left] > nums[right]:
renum[k] = nums[left]
k= k - 1
left = left + 1 #左边取完,向中间走一步
else:
renum[k] = nums[right]
k= k - 1
right = right - 1
return renum
有序数组的平方:有序数组两边的平方值大,设置双指针从左右往中间聚,就可以得到从大到小排序的数组,再将数组倒序排列(k从len(nums)——>0)。
209. 长度最小的子数组
代码
:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = 0
right = 0
sum = 0
min_len = float('inf')
while right < len(nums):
sum = sum + nums[right]
while sum >= target:
sum = sum - nums[left]
min_len = min(min_len,right-left+1)
left = left + 1 #其他操作完成后再向右移动
right = right + 1
if min_len != float('inf'):
return min_len
else:
return 0
滑动窗口
滑动窗口:就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
i从首项开始,下标j向后移动,直到窗口内的和>sum,至此确定j的位置;然后不断向后移动i的位置,知道窗口长度最小。
59. 螺旋矩阵 II
代码
:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0]*n for _ in range(n)] #快速生成n个长度为n的数组
startx = 0
starty = 0
count = 1
#左闭右开,每条边只处理左端点
#i行j列
for k in range(1,n//2+1): #k为每圈的深度
for i in range(starty,n-k):#横着(→),改变j
nums[startx][i] = count
count += 1
for i in range(startx,n-k):#竖着(↓),改变j
nums[i][n-k] = count
count += 1
for i in range(n-k,starty,-1):#横着(←),改变j
nums[n-k][i] = count
count += 1
for i in range(n-k,startx,-1):#竖着(↑),改变j
nums[i][starty] = count
count += 1
startx += 1
starty += 1
if n % 2 ==1:
nums[n//2][n//2] = count
return nums
循环不变量原则
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
由外向内一圈一圈这么画下去。
每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来
左闭右开的原则,画一圈:
总结
- 滑动窗口
- 循环不变量原则