目录
今日任务:
- 977.有序数组的平方
- 209.长度最小的子数组
- 59.螺旋矩阵||
977.有序数组的平方
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
方法一:暴力排序法
分析:
- 将数组中的元素先平方
- 之后用sort()函数再进行排序
注意:
- list.sort()直接修改原列表,sorted()不能但更有效率(在无需原列表中使用)
- list.sort()只使用于列表,sorted()可接受任何可迭代对象
- 无论list.sort()还是sorted()函数,都有参数reverse,当为Flase(默认)时为升序 ,当为True时为降序
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
val = nums[i]
nums[i] = val**2
nums.sort()
return nums
方法二:暴力排序法+列表推导法
分析:
- 先使用列表推导法,将列表中的数变为平方
- 再使用sorted()函数进行排序
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(x*x for x in nums)
方法三:双指针法
分析:
- step1:定义一个空的列表(或者是非空等长列表也可以)用两个指针i,j分别指向数组的头尾
- step2:
如果
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]:
nums1 = []
i, j = 0, len(nums) - 1
while i != j:
if nums[i] ** 2 < nums[j] ** 2:
nums1.insert(0, nums[j]**2)
j -= 1
else:
nums1.insert(0, nums[i]**2)
i += 1
nums1.insert(0, nums[i]**2)
return nums1
209.长度最小的子数组
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
滑动窗口法:
本题中实现滑动窗口(双指针的一种),主要确定如下三点:
- 窗口内是什么?窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
- 如何移动窗口的起始位置?如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
- 如何移动窗口的结束位置?窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
left = 0
right = 0
min_len = float('inf')
cur_sum = 0 #当前的累加值
while right < l:
cur_sum += nums[right]
while cur_sum >= s: # 当前累加值大于目标值
min_len = min(min_len, right - left + 1)
cur_sum -= nums[left]
left += 1
right += 1
return min_len if min_len != float('inf') else 0
59.螺旋矩阵||
题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
分析:
1.坚持循环不变量原则
2.模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
3.我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0 # 起始点
loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从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 : # n为奇数时,填充中心点
nums[mid][mid] = count
return nums