977. Squares of a Sorted Array
解法1:遍历+.sort()
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = []
for i in nums:
res.append(i*i)
res.sort()
return res
解法2:双指针
class Solution:
def sortedSquares(self, nums):
n = len(nums)
result = [0] * n
left = 0
right = n - 1
for i in range(n - 1, -1, -1):
if abs(nums[left]) < abs(nums[right]):
square = nums[right]
right -= 1
else:
square = nums[left]
left += 1
result[i] = square * square
return result
209. Minimum Size Subarray Sum
解法:双指针/滑窗
- res初始化为无限大:float("inf")
- 使用Sum记录滑窗内的数字之和,使用left表示滑窗左边界,使用right表示滑窗右边界
- for循环右边界:把新数字添加到Sum中
- while循环左边界移动的条件(即Sum是否大于等于targer)。如果符合条件,则:
- 更新res
- Sum减去最左边的滑窗数值
- 滑窗左边界向前移动一位
- 结果:
- 如果res还是无限大,则返回0
- 如果res被更新了,则返回res
- 时间复杂度:O(N)
-
不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(N)
-
class Solution:
def minSubArrayLen(self, s, nums):
res = float("inf")
Sum = 0
left = 0
for right in range(len(nums)):
Sum += nums[right]
while Sum >= s:
res = min(res, right - left + 1)
Sum -= nums[left]
left += 1
return 0 if res==float("inf") else res
59. Spiral Matrix II
- 边1的规则:
- 横坐标startx不变
- 纵坐标从starty到n-offset左闭右开
- 边2的规则
- 横坐标从startx到n-offset左闭右开
- 纵坐标starty不变
- 边3的规则:
- 横坐标n-offset不变
- 纵坐标从n-offset到starty左闭右开
- 边4的规则:
- 横坐标从n-offset到startx左闭右开
- 纵坐标不变
class Solution:
def generateMatrix(self, n):
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0 # 起始点
loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从1开始
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