977.有序数组的平方
题目链接: 有序数组的平方
第一想法:暴力,遍历数组平方后排序,
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
nums[i] = nums[i] ** 2
nums.sort()
return nums
学习连接:代码随想录—有序数组的平方
学习后的方法:双指针,数组平方的最大值在数组的两端,i指向起始位置,j指向终点位置
- 如果A[i] * A[i] < A[j] * A[j] , 那么result[k–] = A[j] * A[j]
- 如果A[i] * A[i] >= A[j] * A[j],那么result[k–] = A[i] * A[i]
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l, r = 0, len(nums) - 1
n = len(nums)
ans = [0 for _ in range(n)]
k = n - 1
while k >= 0:
if nums[l] ** 2 > nums[r] ** 2:
ans[k] = nums[l] ** 2
k -= 1
l += 1
else:
ans[k] = nums[r] ** 2
k -= 1
r -= 1
return ans
注意:nums[l] ** 2 > nums[r] ** 2和k的对应关系,自己第一次用双指针的思想这里写反了
209.长度最小的子数组
第一想法:暴力遍历,两层循环,如果累加大于目标值且长度小于最小长度就更新ans(最小长度)
学习连接:代码随想录—209
滑动窗口-闪电五连鞭带你秒杀
学习后的想法:滑动窗口
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
ans = math.inf
l = 0
sum_targert = 0
# 移动右指针
for r in range(len(nums)):
sum_targert += nums[r]
# 移动左指针
while sum_targert >= target:
ans = min(ans,r-l+1)
sum_targert -= nums[l]
l += 1
return ans if ans != math.inf else 0
59. 螺旋矩阵 II(补)
无想法
学习后的想法:
学习链接: 代码随想录
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
count = 1
start_x,start_y = 0, 0
matrix = [[0]*n for i in range(n)]
loop, mid = n // 2, n // 2
for offset in range(1,loop+1):
for i in range(start_y, n - offset):
matrix[start_x][i] = count
count += 1
for i in range(start_x, n - offset):
matrix[i][n-offset] = count
count += 1
for i in range(n-offset,start_y, -1):
matrix[n-offset][i] = count
count += 1
for i in range(n - offset, start_x, -1):
matrix[i][start_y] = count
count += 1
start_x += 1
start_y += 1
if n % 2 == 1:
matrix[mid][mid] = count
return matrix