思路:使用暴力解法的话,for循环平方后再直接排序。双指针的话,有序递增数组,左右对比最大值在左边还是右边,再把最大值放到新数组的最后面
总结:做这个题相当又巩固了一遍昨天的知识,已经开始熟练亿点点啦~~
代码:①暴力解法
def sortedSquares(self, nums):
for i in range(len(nums)):
nums[i] *= nums[i]
nums.sort()
return nums
②双指针
def sortedSquares(self, nums):
l, r, i = 0, len(nums) - 1, len(nums) - 1
res = [float('inf')] * len(nums) # 初始化,存放结果
while l <= r:
if nums[l] ** 2 < nums[r] ** 2: # 有序递增数组,平方后不是左边最大就是右边最大
res[i] = nums[r] ** 2
r -= 1
else:
res[i] = nums[l] ** 2
l += 1
i -= 1
return res
思路:通过滑动j终止位置来累加元素是否>=target,目标成立计算当前连续数组的长度,起始位置则左移,缩小范围看目标是否成立,不成立终止位置再左移
总结:看着简单,认真敲起来密思极恐,细节处理一塌糊途,特别是最后的返回值,居然返回成累加数(扶额苦笑.jpg),跑死对不上号,差点怀疑人生,不过还是让我学到了新知识,想不到吧~
代码:①滑动窗口
def minSubArrayLen(self, target, nums):
# 长度最小的子数组-滑动窗口
i, j = 0, 0 # i起始位置,j终止位置
min_len = float('inf')
res = 0 # 累加数
while j < len(nums):
res += nums[j]
while res >= target:
min_len = min(min_len, j - i + 1) # 计算子数组长度
res -= nums[i]
i += 1 # 起始位置右移
j += 1
min_len = 0 if min_len == float('inf') else min_len
return min_len
三、59.螺旋矩阵
思路:边界太多,看到头点点大,左右、上下、右左、下上依次循环
总结:看到题目的时候,emo了下,觉得自己还是太菜了。。此代码解法太妙,只敢在心里直呼牛哇。脑子是个好东西,可惜不是人人都有,我就只有一星半点,还得再练练,再会。。
代码:
def generateMatrix(self, n):
# 螺旋矩阵 II
mat = [[0] * n for _ in range(n)]
l, r, t, b = 0, n - 1, 0, n - 1
num, tar = 1, n * n
while num <= tar:
for i in range(l, r + 1): # 左向右
mat[t][i] = num
num += 1
t += 1
for i in range(t, b + 1): # 上向下
mat[i][r] = num
num += 1
r -= 1
for i in range(r, l - 1, -1): # 右向左
mat[b][i] = num
num += 1
b -= 1
for i in range(b, t - 1, -1): # 下向上
mat[i][l] = num
num += 1
l += 1 # 最后这个会把中心填上
return mat