Q1 977. Squares of a Sorted Array
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
i, j = 0, len(nums)-1
res = []
while i <= j:
if abs(nums[i]) >= abs(nums[j]):
res.append(nums[i]*nums[i])
i += 1
else:
res.append(nums[j]*nums[j])
j -= 1
res.reverse()
return res
用时3min;双指针
Q2: 209. Minimum Size Subarray Sum
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
s, t, res = 0, 1, 100001
cur_sum = nums[0]
while t < len(nums):
if cur_sum < target:
cur_sum += nums[t]
t += 1
else:
res = min(res, t-s)
cur_sum -= nums[s]
s += 1
while cur_sum >= target:
res = min(res, t-s)
cur_sum -= nums[s]
s += 1
return res if res!=100001 else 0
用时17min;要注意的点是还有第二个while循环,第一个循环退出的条件是t < len(nums),这时可能还没有到达最优情况
Q3 59. Spiral Matrix II
第一种解法:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
res = [[0]*n for _ in range(n)]
l, r, t, b = 0, n-1,0, n-1
v = 1
while l <= r and t <= b:
for k in range(l, r+1, 1):
res[t][k] = v
v += 1
t += 1
for k in range(t, b+1, 1):
res[k][r] = v
v += 1
r -= 1
for k in range(r, l-1, -1):
res[b][k] = v
v += 1
b -= 1
for k in range(b, t-1, -1):
res[k][l] = v
v += 1
l += 1
return res
第二种解法:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
# spiral walk
res = [[0]*n for _ in range(n)]
i,j,di,dj = 0,0,0,1
for k in range(n*n):
res[i][j] = k+1
if res[(i+di)%n][(j+dj)%n]:
di, dj = dj, -di
i += di
j += dj
return res
用时超过30min;第一种解法更直观,但是个人更喜欢第二种解法,写起来好看更多,这种旋转的结构很适合。