977 有序数组的平方
题目连接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/
暴力解法:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(num * num for num in nums)
双指针解法:
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
过程易错点:
1、result定义的时候,应该注意定义为一个与nums长度相同的数组,如果单单定义为一个空数组,下面进行更新时会报错,因为空数组应该是添加元素而不是更新index的元素
2、python语言中的平方写法是**
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
i = 0
j = len(nums) - 1
k = len(nums) - 1
result = [-1] * len(nums)
while i <= j:
if nums[i] ** 2 >= nums[j] ** 2:
result[k] = nums[i] ** 2
i += 1
else:
result[k] = nums[j] ** 2
j -= 1
k -= 1
return result
209.长度最小的子数组
题目链接:力扣
滑动窗口写法:
1、无限大的数的写法是 float("inf")
2、如果里面不做判断可以将返回写成:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
i = 0
sum = 0
result = float("inf")
for j in range(len(nums)):
sum += nums[j]
while(sum >= target):
L = j - i + 1
result = min(result, L)
sum -= nums[i]
i += 1
return 0 if result==float("inf") else result
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
i = 0
sum = 0
result = float("inf")
for j in range(len(nums)):
sum += nums[j]
if j == len(nums)-1 and sum < target:
return 0
while(sum >= target):
L = j - i + 1
result = min(result, L)
sum -= nums[i]
i += 1
return result
59. 螺旋矩阵 II
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
遇到的问题:
1、随机生成n*n的矩阵,可参考:https://blog.csdn.net/justheretobe/article/details/7632487
2、遍历时边界值的处理
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
startx = 0
starty = 0
count = 1
array = [[0] * n for _ in range(n)]
for offset in range(1, n//2+1):
for j in range(starty, n-offset):
array[startx][j] = count
count += 1
for i in range(startx, n-offset):
array[i][n-offset] = count
count += 1
for j in range(n-offset, starty, -1):
array[n-offset][j] = count
count += 1
for i in range(n-offset, startx, -1):
array[i][starty] = count
count += 1
startx += 1
starty += 1
if n%2 == 1:
array[n//2][n//2] = count
return array