文档链接:代码随想录
题目链接:977.有序数组的平方
视频讲解:视频讲解
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序进阶:
O(n)
的算法解决本问题思路:数组的值按照升序排列,存在负数,平方后两边的值最大,依次判断平方后两边的值哪个大,大的值依次放在新数组的最右边(新数据也是按照升序排列)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left,right,k = 0,len(nums)-1,len(nums)-1
result = [float('inf')] * len(nums) #具有相同长度并初始化为正无穷大的列表
while left<=right:
if nums[left]**2>nums[right]**2:
result[k]=nums[left]**2
left+=1
elif nums[left]**2<=nums[right]**2:
result[k]=nums[right]**2
right-=1
k-=1
return result
文档链接:代码随想录
题目链接:209.长度最小的子数组
视频讲解:视频讲解
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
进阶:
O(n)
时间复杂度的解法, 请尝试设计一个 O(n log(n))
时间复杂度的解法。思路:通过窗口的左右边界解决问题
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left, right, sum = 0, 0, 0
minlen = float("inf") # 正无穷大
for right in range(len(nums)):
sum += nums[right]
while sum >= target: # 子数组之和大于目标值
minlen = min(minlen, right - left + 1)
sum -= nums[left]
left += 1
right -= 1
return minlen if minlen != float("inf") else 0
文档链接:代码随想录
题目链接:59.螺旋矩阵II
视频讲解:视频讲解
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
思路:要生成一个按顺时针螺旋顺序排列的 n×n 矩阵,我们可以使用四个指针来跟踪当前要填充的位置。初始时,这四个指针分别指向矩阵的左上角、右下角、左下角和右上角。然后,我们按照以下步骤进行填充:
从上到下填充右边界的列:
从右到左填充下边界的行:
从下到上填充左边界的列:
重复步骤 1-4,直到所有数字都被填充到矩阵中。
返回生成的矩阵。
通过这种方式,我们可以按照顺时针螺旋顺序生成一个 n×n 的矩阵。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
# 初始化一个 n*n 的矩阵,所有元素为 0
matrix = [[0] * n for _ in range(n)]
# 当前要填充的数字
num = 1
# 定义矩阵的边界,初始时左、右、上、下分别为 0 到 n-1
left, right, top, bottom = 0, n - 1, 0, n - 1
# 当还有数字需要填充时,继续循环
while num <= n * n:
# 从左到右填充上边界的行
for i in range(left, right + 1):
matrix[top][i] = num
num += 1
top += 1 # 上边界下移
# 从上到下填充右边界的列
for i in range(top, bottom + 1):
matrix[i][right] = num
num += 1
right -= 1 # 右边界左移
# 从右到左填充下边界的行
for i in range(right, left - 1, -1):
matrix[bottom][i] = num
num += 1
bottom -= 1 # 下边界上移
# 从下到上填充左边界的列
for i in range(bottom, top - 1, -1):
matrix[i][left] = num
num += 1
left += 1 # 左边界右移
return matrix # 返回生成的矩阵