977.有序数组的平方
题目链接:977.有序数组的平方
文档讲解:977.有序数组的平方-文档讲解
视频讲解:977.有序数组的平方-视频讲解
思路:利用双指针,两个指针分别控制区间的左右元素。
有序数组可能有三种情况:全部大于等于0;全部小于等于0;一部分大于0一部分小于0。
- 构建一个新的数组
res = [float('inf')] * len(nums)
,用于存放整理好的数组,新创建的数组从后往前遍历 - 左右指针指向原数组的左右边界元素,不断相比较左右指针指向的元素,将更大的值赋值给新数组
- 边界条件处:
left <= right
,这里需要相等,此时两个指针指向的元素也要取平方项赋值给新数组
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
# 11234
left, right = 0, len(nums) - 1
i = len(nums) - 1
res = [float('inf')] * len(nums)
while left <= right: # 为什么要等于?
if nums[left] * nums[left] > nums[right] * nums[right]:
res[i] = nums[left] * nums[left]
left += 1
elif nums[left] * nums[left] <= nums[right] * nums[right]:
res[i] = nums[right] * nums[right]
right -= 1
i -= 1
return res
209.长度最小的子数组
题目链接:209.长度最小的子数组
文档讲解:209.长度最小的子数组-文档讲解
视频讲解:209.长度最小的子数组-视频讲解
思路:利用双指针、滑动窗口思想
- 将左右指针划定的区域作为窗口,不断遍历移动右指针,将右指针元素添加进窗口和
sum
中; - 当窗口内元素和大于等于
target
的时候,将当前窗口长度与已记录的窗口长度length
作比较,取最小值,移动左指针,缩小窗口;
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
# 从一个数组中,找出子数组,是连续的
left, right = 0,0
sum = 0
length = float('inf')
while right < len(nums):
sum += nums[right]
while sum >= target:
length = min(length, right - left + 1)
sum -= nums[left]
left += 1
right += 1
return length if length != float('inf') else 0
59.螺旋矩阵
题目链接:59.螺旋矩阵
文档讲解:59.螺旋矩阵-文档讲解
视频讲解:59.螺旋矩阵-视频讲解
思路:利用双指针、固定区间不变量,比如[left, right)
- 创建二维数组
nums = [[0] * n for _ in range(n)]
- 模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
- 注意python语言的遍历:
for offset in range(1, loop + 1)
:
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