977、有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
关键词:快慢指针
题目链接:题目链接
视频讲解:视频讲解
自己题目理解:直接遍历平方再sort,或者利用快慢指针再排序(开始将i++和n–统一放在循环尾部,结果排出来一半数据。。。)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
#i, n=0, len(nums)
#while i<n:
# nums[i]=nums[i]**2
# i+=1
#nums.sort()
#return nums #自己解题思路
i, n = 0, len(nums)-1
res=[]
while i<=n:
if nums[i]**2<nums[n]**2:
res.append(nums[n]**2)
n-=1
else:
res.append(nums[i]**2)
i+=1
return sorted(res) #自己利用快慢指针
最终看了视频才知道可以提前定义空数组的个数,又属于小白的盲区了。。。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
i, n, m= 0, len(nums)-1,len(nums)-1
res=[0]*len(nums)#提前定义数组长度
while i<=n:
if nums[i]**2<nums[n]**2:
res[m]=nums[n]**2
n-=1
else:
res[m]=nums[i]**2
i+=1
m-=1#从后往前放数据,放完指针往前移动
return res #答案利用快慢指针
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
关键词:滑动窗口
题目链接:链接
视频讲解:链接
自己理解题目:头脑风暴,一想就是很复杂,感觉只能暴力举例。。。
--------滑动窗口--------
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
i, j, n=0, 0,len(nums) #分别表示边界起始和结束,数组长度
s=0 #用来存放临时子数组和
res, ll= float("inf"),0 #分别存放长度结果(赋值为正无穷)和每个满足条件的子数组长度
for j in range(len(nums)):
s+=nums[j] #利用j来收集和
while s>=target: #当收集到的和满足条件时
ll=j-i+1 #存放当前的长度
res=min(res,ll) #更新最小长度
s=s-nums[i] #寻找下一个满足条件的和,需要先减去子数组起始元素
i+=1 #移动起始元素
return res if res!=float("inf") else 0 #如果res未被更新过返回0
---------暴力解法---------超出时间限制
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
min_len = float('inf') #初始化为正无穷
for i in range(l): #从起始0遍历数组
cur_sum = 0 #每次遍历清零
for j in range(i, l): #从起始i开始遍历
cur_sum += nums[j] #求和
if cur_sum >= s: #满足条件时
min_len = min(min_len, j - i + 1) #更新长度
break #跳出当前起始i的遍历,以开始后面i++遍历
return min_len if min_len != float('inf') else 0 #没有满足条件的返回0
59、螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
题目链接:链接
视频链接:链接
自己思路:完全不会的状态,先理解吧
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