977 有序数组的平方
思路:这个列表其实内部已经排过序(非递减),用对撞指针不断逼近,绝对值较大的放在列表尾部,绝对值较小的放在列表头部。
但是一开始忽略了列表长度为1时的列表情况,把题算错了(提醒以后一定要注意列表为1时这种临界条件的测试)
总感觉这题背后的left和right是否能够相等有大文章,什么时候想等,什么时候不等于,可以总结一下
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
#用双指针,比较绝对值的大小,不断加到列表尾部
left ,right = 0,len(nums)-1
num = [0]*len(nums)
n = -1
if len(nums) == 1:
return [nums[0]**2]
while left < right:
a,b = abs(nums[left]),abs(nums[right])
if a <= b:
num[n] = b**2
right -= 1
else:
num[n] = a**2
left += 1
n -= 1
if a <= b:
num[0] = a**2
else:
num[0] = b**2
return num
写的太臃肿,第一个元素的处理和一个元素的列表的处理
209. 长度最小的子数组
如果是不停的去找最小值时,应当用无穷大的符号
float('inf')
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left,right,total,minlen= 0,0,0,float('inf')
while right <= len(nums)-1:
total += nums[right]
while total >= target:
minlen = min(minlen,right-left+1)
total -= nums[left]
left += 1
right += 1
return minlen if minlen != float('inf') else 0
滑动窗口的思想,应该是要关注比较快的指针,right处的,而且这道题注意一下是用while循环控制,这一点老是写错,可能是写代码的方法有问题,可以模拟一个简单的过程,不出错后不停迭代。
这一部分还是要加大训练的力度!!!!
59.螺旋矩阵(2)
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
#是一个模拟数组的题,一定要清楚这个顺序
left,right,up,down = 0,n-1,0,n-1
number = 1
matrix = [[0 for _ in range(n)] for _ in range(n)]
while left < right and up < down:
for i in range(left,down):
matrix[up][i] = number
number += 1
for i in range(up,down):
matrix[i][right] = number
number += 1
for i in range(right,left,-1):
matrix[down][i] = number
number += 1
for i in range(down,up,-1):
matrix[i][left] = number
number += 1
left += 1
right -= 1
up += 1
down -= 1
if n%2 == 1:
n1 = n//2
matrix[n1][n1] = number
return matrix
这里面存在一个深拷贝还是浅拷贝的问题
[[0 for _ in range(n)] for _ in range(n)]
只有这么初始化,才能保证里边的各个列表不会指向同一个位置
[[0]*n]*n
这样写最后的每一行会是一样的,就会有问题!!!