Leetcode977 , Leetcode 209 and Leetcode 59
Leetcode977 打卡:返回数组的平方值组成的新数组,且按非递减序列排序
-
方法一:暴力解法。遍历平方一遍之后排序
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
#方法一:遍历后排序
res=[]
for i in nums:
res.append(i*i)
res.sort()
return res
时间复杂度:O(n+log n) 其中logn是排序的时间复杂度 空间复杂度:O(n)
-
方法二:双指针。
这道题目中的双指针指左边开头和右边结尾处的两个
- 左指针:从数组左边开始指
- 右指针:从数组右边开始指
主要目的是比较两端的元素谁的绝对值更大,将更大的数放入结果数组(res)。在res中逆方向进行。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
#方法二:双指针
n=len(nums)
res=[0]*n
left,right=0,n-1
i=n-1
while left<=right:
if abs(nums[left])>abs(nums[right]):
res[i]=(nums[left])**2
left+=1
else:
res[i]=(nums[right])**2
right-=1
i-=1
return res
Leetcode209 打卡:找出满足条件的数组
-
滑动窗口
滑动窗口是另一种意义上的双指针
- 左指针:指向满足条件窗口的左边
- 右指针:指向满足条件窗口的右边
在此窗口内,所有元素之和大于等于目标值时,计算当前窗口的大小,并将左指针继续向右移动,缩小窗口的大小。取满足条件窗口的最小值。当元素之和小于目标值时,右指针向右继续移动。直到左右指针都指向数组末尾。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
total=0
left=0
res=float('inf')
for i in range(len(nums)):
total += nums[i]
while total>=target:
total-=nums[left]
length=i-left+1
left+=1
res=min(res,length)
return res if res!=float('inf') else 0
Leetcode209 打卡:螺旋数组的放置
- 用数组的四条边界作为约束条件,逐步将里面的值填满
- 注意!:在设置数组时犯的错误:
#以下两个二维数组不同 res=[[0]*n for _ in range(n)]#每一行都是独立的,改变单独的值不会影响其他行 res=[[0]*n]*n #相当于是复制的,改变一个的值其他行也会随着变化
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
res=[[0]*n for _ in range(n)]
num=1
top,left=0,0
bottom,right=n-1,n-1
while left<=right and top<=bottom:
#从左到右排序时
for i in range(left,right+1):
res[top][i]=num
num+=1
top+=1
#从上到下排序
for i in range(top,bottom+1):
res[i][right]=num
num+=1
right-=1
#从右到左排序
for i in range(right,left-1,-1):
res[bottom][i]=num
num+=1
bottom-=1
#从下到上排序
for i in range(bottom,top-1,-1):
res[i][left]=num
num+=1
left+=1
return res
总结
这两天的内容是数组,注意数组的地址是连续的。在解决数组的相关问题时,可以利用:
- 二分法:针对已经排序的数组。要注意区间闭合问题,左闭右开还是左闭右闭。会影响查找时开始和结束的位置
- 双指针法:有快慢指针,两头指针。根据不同的需求考虑用哪一种
- 滑动窗口:当所需要的结果是一个区间时,可以利用这个方法。
参考:代码随想录