本系列文章是我刷代码随想录过程中的笔记。代码地址:leetcode
今天是我刷“代码随想录”的第二天
今日内容
- 有序数组的平方
- 长度最小的子数组
- 螺旋矩阵
leetcode 977.有序数组的平方
这道题是一个双指针的题目。注意到负数的平方为正数,那么,我们可以从数组的两端设定两个指针,分别定义为l,r,
同时设定一个指针p指向结果数组的末尾。设定循环结束条件为头指针大于尾指针
如果nums[l] * nums[l] > nums[r] * nums[r]的时候,我们将头指针的平方赋给p,同时l++,p--;其他情况下将尾指针的平方赋给p,同时r--,p--。
如动图所示。
下面是求解代码
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
result = [0 for _ in nums]
l, r = 0,len(nums) - 1
p = len(nums) - 1
while l <= r:
if (nums[l] * nums[l]) < (nums[r] * nums[r] ):
result[p] = nums[r] ** 2
r -= 1
else:
result[p] = nums[l] ** 2
l += 1
p -= 1
return result
leetcode 209. 长度最小的子数组
这道题主要用了滑动窗口的思想。难点在于如何控制窗口的大小以及什么时候改变。对于这道题而言,当连续子数组的和小于目标值的时候,改变右端,即往子数组中追加元素;当和大于等于目标值的时候,比较子数组的长度与已知子数组的长度的大小并记录较小的那个,移动左端。最后返回长度。
下面是求解代码
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
res = float("inf") # 定义一个无限大的数
Sum = 0 # 滑动窗口数值之和
i = 0 # 滑动窗口起始位置
for j in range(len(nums)):
Sum += nums[j]
while Sum >= s:
res = min(res, j-i+1)
Sum -= nums[i]
i += 1
return 0 if res == float("inf") else res
leetcode 59. 螺旋矩阵 II
这道题是一道模拟题,按照题目描述的说明走完全程即可。难点在于要注意边界值。尤其是最后一次从右往左的值很容易被忽略。
下面是求解代码。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
res = [[0 for _ in range(n)] for _ in range(n)]
t, b, l, r = 0, n - 1, 0, n - 1
s = 1
while r - l >= 1 and b - t >= 1:
# 上
for i in range(l, r + 1):
res[t][i] = s
s += 1
t += 1
# print(res)
# 右
for i in range(t, b + 1):
res[i][r] = s
s += 1
r -= 1
# print(res)
# 下
for i in range(r, l, -1):
res[b][i] = s
s += 1
b -= 1
# 左
for i in range(b + 1, t - 1, -1):
res[i][l] = s
s += 1
l += 1
if n % 2:
mid = n // 2
res[mid][mid] = n * n
return res
总结
数组部分到今天就结束了。目前来说都是一些经典的简单题。难点在于如何处理边界条件,能不能想出求解的思路和过程。还有就是边界值的处理,像昨天的二分法,今天的模拟法,都是涉及到边界值的处理问题。这些题目值得刻在DNA里。