第一想法:暴力
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
if len(nums)==0:
return []
nums = sorted(nums,key = abs)
for i in range(len(nums)):
nums[i] = nums[i]**2
return nums
第二种办法:双指针
同时定义一个新数组result,和nums数组一样的大小,让k指向result数组终止位置
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
if nums is None or len(nums)==0:
return []
res = [-1] * len(nums)
low = 0
high = len(nums)-1
k = len(nums)-1
while(low<=high):
if(abs(nums[low])<=abs(nums[high])):
res[k] = nums[high]** 2
high-=1
else:
res[k] = nums[low]** 2
low+=1
k-=1
return res
没想法
滑动窗口方法总结:
实际上可以看成是双指针,两个指针不断的调节子序列的起始位置和终止位置。
自己写的:超出时间限制。可能是因为使用的切片方式算sum。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
low = 0
res = float("inf")
for high in range(len(nums)):
while sum(nums[low:high+1])>=target:
cur = high+1-low
res = min(cur,res)
low += 1
return 0 if res==float("inf") else res
答案:使用一个sums随时记录窗口内的值
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
low = 0
res = float("inf")
sums = 0
for high in range(len(nums)):
sums += nums[high]
while sums>=target:
suml = high+1-low
res = min(suml,res)
sums -= nums[low]
low += 1
return 0 if res==float("inf") else res
没思路。
太晕了,之后得多看几遍
需要明确循环不变量。
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
左闭右开(看颜色区分!!拐角处让给新的一条边来继续画)
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0 # 起始点
loop, mid = n // 2, n // 2 # 循环几圈?n为奇数时,矩阵的中心点
count = 1 # 计数1,2,3,4,。。。
for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从1开始
for j in range(starty,n-offset):
nums[startx][j] = count #第一行,j=0不动,横坐标++,左至右
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#起始点(0,0)经过一个循环之后,变成(1,1)
starty += 1
if n%2==1:#循环到最后,中间是否还剩一个值
nums[mid][mid]=count
return nums