977 有序数组的平方
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
方法1:使用sort()函数,直接进行排序
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted([num**2 for num in nums])
方法2 双指针
数组按照非递减顺序排列,平方后的最大值位于两端,故选用双指针
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left = 0
right = len(nums) - 1
res = [0] * len(nums)
index = len(nums) - 1
while left <= right:
if abs(nums[left]) > abs(nums[right]):
res[index] = nums[left] ** 2
left += 1
else:
res[index] = nums[right] ** 2
right -= 1
index -= 1
return res
209长度最小的子数组
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
方法1:暴力解法 两个for循环,遍历所有元素,时间复杂度为O(n**2)
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
#暴力法
res = float('inf')
for i in range(len(nums)):
tmp = 0
for j in range(i,len(nums)):
tmp += nums[j]
if tmp >= target:
res = min(res,j-i+1)
break
return res if res != float('inf') else 0
方法2 滑动窗口 相当于有不同长度的窗口在数组上滑动,要返回满足要求的窗口的最小长度
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
#滑动窗口 快慢指针
n = len(nums)
left,right = 0,0
res = float('inf')
ans = 0
while right < n:
ans += nums[right]
while ans >= target:
res = min(res,right-left+1)
ans -= nums[left]
left += 1
right += 1
return res if res != float('inf') else 0
59 螺旋矩阵II
思路:每条边要用相同的区间,可采用左闭右开,四条边分别处理
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
#左闭右开区间
startx = 0 #起始位置
starty = 0 #起始位置
tmp = 1 #表示圈数
res = [[0] * n for _ in range(n)]
ans = 1
while tmp <= n // 2:
#上边
for i in range(starty,n-tmp):
res[startx][i] = ans
ans += 1
#右边
for i in range(startx,n-tmp):
res[i][n-1-starty] = ans
ans += 1
#下边
for i in range(n-tmp,startx,-1):
res[n-1-startx][i] = ans
ans += 1
#左边
for i in range(n-tmp,starty,-1):
res[i][starty] = ans
ans += 1
startx += 1
starty += 1
tmp += 1
if n % 2 == 1:
res[n//2][n//2] = n**2
return res