977.有序数组的平方 ,209.长度最小的子数组 ,
Tasks
977.有序数组的平方
题目建议: 本题关键在于理解双指针思想
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep
209.长度最小的子数组
题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
59.螺旋矩阵II
题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
总结
题目建议:希望大家 也做一个自己 对数组专题的总结
文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E6%80%BB%E7%BB%93%E7%AF%87.html
Individual assignment
977 暴力求解(Violent solution)
def sortedSquares(A):
A = [x**2 for x in A]
A.sort()
return A
# 提示用户输入数据
input_str = input("请输入一系列整数,用逗号分隔: ")
# 将输入的字符串转换为整数列表
# 先使用 split(',') 根据逗号分隔字符串,然后使用列表推导式将每个部分转换为整数
numbers = [int(x) for x in input_str.split(',')]
# 调用函数并打印结果
print("平方后排序的结果是:", sortedSquares(numbers))
双指针(https://algo.itcharge.cn/01.Array/04.Array-Two-Pointers/01.Array-Two-Pointers/)【转载】
2.2 模版
left, right = 0, len(nums) - 1
while left < right:
if 满足要求的特殊条件:
return 符合条件的值
elif 一定条件 1:
left += 1
elif 一定条件 2:
right -= 1
return 没找到 或 找到对应值
2.3 对撞指针适用范围
对撞指针一般用来解决有序数组或者字符串问题:
查找有序数组中满足某些约束条件的一组元素问题:比如二分查找(day1)、数字之和等问题。
字符串反转问题:反转字符串、回文数、颠倒二进制等问题。
下面我们根据具体例子来讲解如何使用对撞指针来解决问题。
977.有序数组的平方
class Solution:
def sortedSquares(self,A : List[int]):
A = [x**2 for x in A]
A.sort()
return A
209.长度最小的子数组
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n=len(nums)
ans=n+1
i,j=0,0
T=0
while j<n:
T+=nums[j]
while T>=target:
ans=min(ans,j-i+1)
T-=nums[i]
i+=1
j+=1
return 0 if ans == n+1 else ans#一定注意ans==n+1
59.螺旋矩阵II
# 59. 螺旋矩阵 II
class Solution(object):
def generateMatrix(self, n):
matrix = [[0 for i in range(n)] for j in range(n)]
#初始化全0矩阵用来填数字
record = []
record.append(n)
for i in range(n-1, 0, -1):
record.append(i)
record.append(i)
#record是走的步数,矩阵为6*6的话,record就是:6 5 5 4 4 3 3 2 2 1 1
forward = [
[0, 1],
[1, 0],
[0, -1],
[-1, 0]
]
flag = 0
#我们用flag(0,1,2,3,0,1,2,3循环)配合forward(方向矩阵)来走步数
number = 0
#要填的数字
x = 0
y = -1
#初始位置,我是从矩阵第一排第一个左上角数字,再往左一个位置开始走的(-1, 0)
#注意计算机里的二维矩阵,第一个维度是排,第二个维度是列
for i in record:#遍历record步数矩阵,每走到固定步数换方向
for step in range(i):#6*6矩阵第一个方向走6步,所以这时候i是6,step从0到5变化
x += forward[flag][0]
y += forward[flag][1]
#x,y分别前进对应的方向
number += 1
matrix[x][y] = number
#在matrix[x][y]写入我们要写的数字,数字每次写前自增1
flag += 1
flag %= 4
#record的第一个步数i走完,该换方向了,取模%为了循环
return matrix
A = Solution()
A.generateMatrix(6)
# 59. 螺旋矩阵 II
class Solution(object):
def generateMatrix(self, n):
matrix = [[0 for i in range(n)] for j in range(n)]
#初始化全0矩阵用来填数字
record = []
record.append(n)
for i in range(n-1, 0, -1):
record.append(i)
record.append(i)
#record是走的步数,矩阵为6*6的话,record就是:6 5 5 4 4 3 3 2 2 1 1
forward = [
[0, 1],
[1, 0],
[0, -1],
[-1, 0]
]
flag = 0
#我们用flag(0,1,2,3,0,1,2,3循环)配合forward(方向矩阵)来走步数
number = 0
#要填的数字
x = 0
y = -1
#初始位置,我是从矩阵第一排第一个左上角数字,再往左一个位置开始走的(-1, 0)
#注意计算机里的二维矩阵,第一个维度是排,第二个维度是列
for i in record:#遍历record步数矩阵,每走到固定步数换方向
for step in range(i):#6*6矩阵第一个方向走6步,所以这时候i是6,step从0到5变化
x += forward[flag][0]
y += forward[flag][1]
#x,y分别前进对应的方向
number += 1
matrix[x][y] = number
#在matrix[x][y]写入我们要写的数字,数字每次写前自增1
flag += 1
flag %= 4
#record的第一个步数i走完,该换方向了,取模%为了循环
return matrix
A = Solution()
A.generateMatrix(6)