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.数据结构:数组 / 列表
2.算法:双指针(left, right)
3.步骤:
由于所给数组是包含负数的升序排列的数组,故各元素平方后的最大值一直都在数组的左右两边,故双指针要从数组左右两端向中间遍历
a.比较数组两端元素平方值,左边大则 res.append(nums[left]**2) ,left += 1, 右边大则res.append(nums[right]**2) , right += 1
b.由于返回的列表要求升序排列,而此时的res是降序排列,故需res.reverse()
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
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
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.数据结构:数组 / 列表
2.算法:滑动窗口(l, r)
3.步骤:
本题核心是判断窗口内的sum >= target 与否,所以要时刻保证sum是窗口内的值之和。
a.将l 和 r 初始值设为0
b.sum从nums第一个元素开始加起,加一次判断一次
c.若sum < target, r 右移一位,窗口向右扩展
d.若sum >= target, 则进入while 循环 一直缩减左边窗口
e.知道右窗边界抵达原数组长度时循环结束
f.以三元运算符返回结果
class Solution(object):
def minSubArrayLen(self, target, nums):
l, r = 0, 0
sum = 0
res = 1000000
while r < len(nums):
sum += nums[r]
while sum >= target:
res = min(r-l+1, res)
sum -= nums[l]
l += 1
r += 1
return 0 if res == 1000000 else res
59.螺旋矩阵
给你一个正整数 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来创建二维列表,二维列表的表达式为mat = [[0 for _ in range(n)] for _ in range(n)]
2.定义四个参数, l, r, t, b,分别代表正方形的四个边界
3.设num初值为1,将num++依次放进
tips:range(i, j) 包含i不包含j, range(b, t-1, -1)是从b开始到t-1,不包含t-1,只到t(相当于数轴上从右往左数,左为开区间)
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
l ,r, t, b = 0, n-1, 0, n-1
mat = [[0 for _ in range(n)] for _ in range(n)]
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