977. 有序数组的平方
一行偷懒解法:
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
return sorted([x**2 for x in nums])
正式版:
- 数组身有序 ——> 平方后最大值一定在两端——>双指针
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = []
i,j = 0, len(nums)-1
while i <= j:
if nums[i]**2 <= nums[j]**2:
res.append(nums[j]**2)
j -= 1
else:
res.append(nums[i]**2)
i += 1
return res[::-1]
209. 长度最小的子数组
提示O(n):想到 滑动窗口 方法
第一次尝试——超时:
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
start, end = 0, 0
res = float("inf")
while start <= end and start < len(nums) and end < len(nums):
if sum(nums[start:end+1]) >= target :
if end-start+1 < res:
res = end - start + 1
start += 1
else:
end += 1
return 0 if res == float("inf") else res
改进方式:
- 超时:主要是在于计算sum的时候耗费O(n)的时间
- 未判断空的异常情况
第二次尝试——成功
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
if len(nums) == 0 or not nums:
return 0
start, end = 0, 0
res = float("inf")
total = 0
while end < len(nums):
total += nums[end]
while total >= target:
res = min(res, end-start+1)
total -= nums[start]
start += 1
end += 1
return 0 if res == float("inf") else res
注意加减total和移动指针的顺序:先加减、再移动
59. 螺旋矩阵 II
试了几次都不对,看了别人的解法,学习了一种容易理解的:
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
# 初始化参数
l,r,t,b = 0, n-1, 0, n-1 # 标记上下左右
matrix = [[0 for _ in range(n)] for _ in range(n)] # 初始化matrix
num, tar = 1, n*n # 初始化当前预备插入值和结束值
while num <= tar:
# 从左到右
for i in range(l, r + 1):
matrix[t][i] = num
num += 1
t += 1
# 从上到下
for i in range(t, b + 1):
matrix[i][r] = num
num += 1
r -= 1
# 从右到左
for i in range(r, l - 1, -1):
matrix[b][i] = num
num += 1
b -= 1
# 从下到上
for i in range(b, t - 1, -1):
matrix[i][l] = num
num += 1
l += 1
return matrix