class Solution:
##暴力排序
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
nums[i] *= nums[i]
nums.sort()
return nums
##return sorted(nums) sorted返回一个新列表,return nums.sort()相当于直接修改了传入的列表,且返回None
##双指针
def sortedSquares1(self, nums: List[int]) -> List[int]:
left = 0
right = len(nums)-1
i = len(nums)-1
result = [0]*len(nums)
while left <= right:
if nums[left]**2<=nums[right]**2:
result[i] = nums[right]**2
i-=1
right-=1
else :
result[i] = nums[left]**2
i-=1
left+=1
return result
class Solution:
##两层循环
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
len1 = len(nums)
result = len(nums)+1
if sum(nums)<target:return 0
for i in range(len1):
a=0
for j in range(i,len1):
a+=nums[j]
if a >= target:
result = min(j-i+1,result)
break
return result
##滑动窗口
def minSubArrayLen1(self, target: int, nums: List[int]) -> int:
len1 = len(nums)
left = right = 0
cur = 0
min_length = len1+1
while right <len1:
cur+=nums[right]
while cur >= target:
min_length = min(min_length,right-left+1)
cur-=nums[left]
left+=1
right+=1
return min_length if min_length!=len1+1 else 0
连续的子数组:使用滑动窗口减少时间复杂度
窗口:满足其和 ≥ target 的长度最小的连续子数组。
1、每次将右指针包裹进窗口,如果当前窗口的值大于等于target了,窗口左端点向右移动。
2、窗口的结束位置:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
mat = [[0 for _ in range(n)] for _ in range(n)]
left,right,top,bottom = 0,n-1,0,n-1
num,tar = 1,n*n
while num <= tar:
for i in range(left,right+1):
mat[top][i] = num
num+=1
top+=1
##从左到右填充,缩小上边界
for i in range(top,bottom+1):
mat[i][right] = num
num+=1
right-=1
##从上到下填充,缩小右边界
for i in range(right,left-1,-1):
mat[bottom][i] = num
num+=1
bottom-=1
##从右到左填充,缩小下边界
for i in range(bottom,top-1,-1):
mat[i][left] = num
num+=1
left+=1
##从下到上填充,缩小左边界
return mat
part1.构造一个二维矩阵并确定上下左右的边界
matrix = [[0]*n for _ in range(n)]
matrix = [[0 for _ in range(n)] for _ in range(n)]
part2.按顺时针顺序写入矩阵 ,每填充一行或一列都有一个边界要收缩
双指针三种方式:
1、快慢指针:找环形链表
2、前后指针:二分查找
3、滑动窗口:连续子数组