# 977. 有序数组的平方
- 视频链接:
https://leetcode.cn/problems/squares-of-a-sorted-array/
- 第一想法:
已知是有序数组,所以数组两端的绝对值的其中一个一定是最大的。所以设置了两个指针分别指向一头一尾。将最大值倒着填入新的有序平方数组。如果左端的值大于右端的值,把左端的值平方后放入数组,左指针向右移动一位;如果左端的值小于于右端的值,把右端的值平方后放入数组,右指针向左移动一位。
def sortedSquares(nums):
if len(nums) == 0:
return []
l = 0
r = len(nums)-1
new_arr = [0]*len(nums)
idx = len(nums)-1
while idx>=0:
if abs(nums[l]) >= abs(nums[r]):
new_arr[idx] = nums[l]**2
l += 1
else:
new_arr[idx] = nums[r]**2
r -= 1
idx -= 1
return new_arr
- 看完代码随想录的想法:
一样的做法。不一样的终止条件。我用的是idx >= 0,代码随想录里面的是l<=r
- 困难:无
# 209. 长度最小的子数组
- 视频链接:
https://leetcode.cn/problems/minimum-size-subarray-sum/
- 第一想法:
超时。过了给的三个基本测试用例。不太确定终止条件。
def minSubArrayLen(traget,nums):
l,r=0,1
min_len = float('inf')
if sum(nums) < target:
return 0
while r<=len(nums):
sum_sub = sum(nums[l:r])
if sum_sub >= target:
if r-l < min_len:
min_len = r-l
l += 1
else:
r += 1
return min_len
- 看完代码随想录后:
def minSubArrayLen(target,nums):
min_len = float('inf')
l = 0
sum_sub = 0
if sum(nums) < target:
return 0
for r in range(len(nums)):
sum_sub += nums[r]
while sum_sub >= target:
min_len = min(min_len, r-l+1)
sum_sub -= nums[l]
l += 1
return min_len
- 困难:把思路局限在只用一个while loop,所以不知道怎么设置终止条件。
# 59. 螺旋矩阵II
- 视频链接:
https://www.bilibili.com/video/BV1SL4y1N7mV/
- 第一想法:
尝试寻找规律。感觉要一圈一圈的填,但是想不出终止条件
(0,0) (0,1) (0,2) .... (0,n-1)
(1,n-1) (2,n-1).... (n-1,n-1)
(n-1,n-2) (n-1,n-3) .... (n-1,0)
(n-2,0) (n-3,0) ... (1,0)
- 看完代码随想录:
1. 要使用左闭右开
2. 以offset为终止条件
def generateMatrix(n):
mat = [[0] * n for _ in range(n)]
num = 1 # initial number
count = n // 2 # number of loops
startX, startY = 0,0
for offset in range(1,count+1):
# from left to right
for i in range(startY,n-offset):
mat[startX][i] = num
num += 1
# from upper to lower
for i in range(startX,n-offset):
mat[i][n-offset] = num
num += 1
# from right to left
for i in range(n-offset,startY,-1):
mat[n-offset][i] = num
num += 1
# from lower to upper
for i in range(n-offset,startX,-1):
mat[i][startY] = num
num += 1
startX += 1
startY += 1
if n%2 != 0: # when n is odd, fill in the center of matrix
mat[n//2][n//2] = n**2
return mat
- 困难:想不出终止条件