题目一
采用双指针法,仍然需要注意区间的开闭判断情况
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
left=0
right=len(nums)-1
nums_square=[0]*len(nums)
end=right
while left<=right:
if nums[left]*nums[left]<=nums[right]*nums[right]:
nums_square[end]=nums[right]*nums[right]
right-=1
elif nums[left]*nums[left]>nums[right]*nums[right]:
nums_square[end]=nums[left]*nums[left]
left+=1
end-=1
return nums_square
题目二
滑动窗口法,遍历窗口结束位置,然后动态调节起始位置。应该预先设置result为最长长度,之后在调节窗口起始位置时不断更新result
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
start=0
result=len(nums)
sm=0
if sum(nums)<target:
return 0
for end in range(len(nums)):
sm+=nums[end]
while sm >=target:
L=end-start+1
result =min(L,result)
sm-=nums[start]
start+=1
return result
题目三
注意循环不变量:每次循环执行时,处理边界的标准要一致(与二分法开闭区间的思想相同),填充顺序为:1-2,3-4,5-6,7-8,9(start:end-offset)
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
nums=[[0]*n for _ in range(n)] #先建立一个数组
startr=0 #初始row
startc=0 #初始clo
offset=1 #每次for循环,从初始位置到最后位置的前一个
count=1 #赋值
cyc=1 #圈数
mid= n//2 #n为奇数,中间单独填充
while cyc<= n//2:#循环的圈数是n//2
for j in range(startc,n-offset) :
nums[startr][j]=count
count+=1
for i in range(startr,n-offset) :
nums[i][n - offset]=count
count+=1
for j in range(n-offset,startc,-1) :
nums[n - offset][j]=count
count+=1
for i in range(n-offset,startr,-1) :
nums[i][startc]=count
count+=1
cyc+=1
startr+=1
startc+=1
offset+=1
if n%2 != 0:
nums[mid][mid]=n*n
return nums