题目链接:
977- 有序数组的平方
1 暴力
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
for i in range(n):
nums[i] = nums[i]*nums[i]
nums.sort()
return nums
2 暴力-简洁版
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(num * num for num in nums)
3 双指针
from typing import List
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l = 0 # Left pointer
r = len(nums) - 1 # Right pointer
i = len(nums) - 1
lst = [0] * len(nums)
while l <= r:
if nums[l] ** 2 >= nums[r] ** 2:
lst[i] = nums[l] ** 2
l += 1
else:
lst[i] = nums[r] ** 2
r -= 1
i -= 1
return lst
注意
双指针要从右边(大的平方数)开始
209- 长度最小的子数组
1 暴力(会超时)
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
min_length = len(nums) + 1
for length in range(len(nums),0,-1):
for start in range(0,len(nums)-length+1):
sub_array = nums[start:start+length]
if sum(sub_array) >= target:
min_length = length
return min_length if min_length != len(nums) + 1 else 0
2 滑动窗口
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = 0
right = 0
nums_length = len(nums)
sum_subarray = 0
min_length = float("inf")
while right <= nums_length - 1:
sum_subarray += nums[right]
while sum_subarray >= target:
min_length = min(min_length, right-left+1)
sum_subarray -= nums[left]
left += 1
right += 1
return min_length if min_length != float("inf") else 0
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
注意
窗口的起始位置如何移动
59- 螺旋矩阵Ⅱ
1 简洁版
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0
loop, mid = n // 2, n // 2
count = 1
for offset in range(1, loop + 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 :
nums[mid][mid] = count
return nums
注意
保证循环规则一致