209长度最小的数组:
这道题还是采用双指针的方法,做过一次之后第二次做还可以,但是有三个点还需要注意:
1.用while而不是if:我们要一直移动left直到小于target,因此符号是大于等于
2.设置一个判断标志,来判断是否找到了满足要求的数组
3.长度是right-left+1
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
result = len(nums) #设置一个很大的数
left = 0 #左指针
total = 0
exist = False
for right in range(len(nums)): #右侧开区间
total += nums[right]
while total >= target:
result = min(result, right-left+1) #>= 所以要加一
total -= nums[left]
left += 1
exist = True
if exist:
return result
else:
return 0
977有序数组的平方
本题采用左右指针的方法,因为大的数都在数组的两边,平方小的数在中间,建立一个空的新数组,从后往前填数
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
k = len(nums) - 1
i = 0
j = k
result = [0]*len(nums)
while i <= j:
if nums[i]**2 > nums[j]**2:
result[k] = nums[i]**2
k -= 1
i += 1
else:
result[k] = nums[j]**2
k -= 1
j -= 1
return result
59.螺旋矩阵II
这道题逻辑比较简单,分好四种情况就可以写出来,需要注意的地方有:
1.当n为奇数时,最后一个数要当作中心点填充
2.确定offset,就是每次循环只填充n-1个数(最外层),offset=1
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
startx = 0
starty = 0
count = 1
loop, mid = n // 2, n // 2 #循环圈数和中心点
nums = [[0] * n for _ in range(n)]
for offset in range(1, loop + 1) : #一圈一圈遍历,offset自己体会
for i in range(starty, n - offset) :
nums[startx][i] = count
count += 1
for i in range(startx, n - offset) : # 从上至下
nums[i][n - offset] = count
count += 1
for i in range(n - offset, starty, -1) : # 从右至左
nums[n - offset][i] = count
count += 1
for i in range(n - offset, startx, -1) : # 从下至上
nums[i][starty] = count
count += 1
startx += 1 # 更新起始点
starty += 1
if n % 2 != 0 : # n为奇数时,填充中心点
nums[mid][mid] = count
return nums
继续加油!!!明天要自学一下链表,然后做下链表的题!!!