代码随想录算法训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
977.有序数组的平方
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
解题:
一、暴力排序法
思路:先平方再排序
快排(升序):
1.'sorted()'函数,返回一个新列表:sorted_nums=sorted(nums)
2.'list.sorted()'方法,直接修改原始列表:nums.sort()
降序:括号里加上(reverse=True)
二、双指针法
思路:题目是含负数的非递减有序数组,最大值肯定在两边。指针从两边往中间移动,则新数组的下标由大到小更新,判断两端的指针对应的哪个数大,就更新哪个。
https://code-thinking.cdn.bcebos.com/gifs/977.有序数组的平方.gif
- while i<=j,有等于,因为相等时也要更新即把数放大新数组里,不然会落下。
- 对于逐步更新最小值问题,定义存放结果的列表可以用正无穷大初始化每个元素: res = [float('inf')] * len(nums)
- 复合赋值运算符'*=',将变量与一个值相乘并将结果赋值给该变量:a *= a,意思是a = a * a;幂运算符'**':b = a ** 2,意思是b = a ^ 2。
点击查看代码
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
i=0
k=len(nums)-1
j=len(nums)-1
result=[float('inf')]*len(nums)
while i<=j:
if nums[i]**2>nums[j]**2:
result[k]=nums[i]**2
i+=1
elif nums[i]**2<=nums[j]**2:
result[k]=nums[j]**2
j-=1
k-=1
return result
209.长度最小的子数组
题目:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
解题:
思路:滑动窗口
一个for循环:j表示终止位置,先往后走,当[起,终]范围内的集合总和大于target,就可以动态调整起始位置往后缩小范围找到该终止位置前满足条件的最小长度的数组。之后移动j实现一层的遍历。
- 用while sum>=target而不是if语句,才可以移动起始位置。
- 判断minL=min(minL,L),只在找到更小长度时才更新,最终找到所有符合条件的窗口中最小的那个。初始值minL=float('inf')
- j+=1放在内层while结束后
点击查看代码
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
i=0
j=0
sum=0
minL=float('inf')
while j<=len(nums)-1:
sum+=nums[j]
while sum>=target:
L=j-i+1
minL=min(minL,L)
sum-=nums[i]
i+=1
j+=1
return minL if minL!=float('inf') else 0
59.螺旋矩阵II
题目:给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
解题:
思路:每条边都遵循统一的[左闭右开)规则,range()就是左闭右开区间
- 边长n,转n/2圈,n如果是奇数,需要最后额外将最后一个元素n^2赋值给中心
- 每循环一圈,偏移量offset都加1
- 创建一个大小为n×n的二维列表并初始化为0:nums = [[0] * n for _ in range(n)]
- 每一圈的左上角为[startx,starty],右下角为[n-offset,n-offset]
点击查看代码
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums=[[0]*n for _ in range(n)]
startx,starty=0,0 #起始点
loop=n//2
mid=n//2
count=1
offset=1 #偏移量,每循环一圈偏移量加1
while offset<=loop:
for j in range(starty,n-offset):
nums[startx][j]=count
count+=1
for i in range(startx,n-offset):
nums[i][n-offset]=count
count+=1
for j in range(n-offset,starty,-1):
nums[n-offset][j]=count
count+=1
for i in range(n-offset,startx,-1):
nums[i][starty]=count
count+=1
startx+=1
starty+=1
offset+=1
if n%2!=0:
nums[mid][mid]=count
return nums
心得:
IndentationError: unindent does not match any outer indentation level表示缩进问题!
IndexError: list index out of range表示范围问题,是否要等于