Leetcode977.有序数组的平方
相向双指针
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
res = [0] * len(nums)
l = 0
r = len(nums) - 1
index = len(nums) - 1
while l <= r:
if abs(nums[l]) >= abs(nums[r]):
res[index] = nums[l]**2
l += 1
else:
res[index] = nums[r]**2
r -= 1
index -= 1
return res
Leetcode209.长度最小的子数组
快慢指针,或者叫滑动窗口,每次for循环都在寻找以快指针指向元素为最后一个元素的符合条件的长度最小的子数组,精髓在于当进入下一个for循环时,慢指针不用回退,因此快慢指针最多各移动n次,n为数组长度,时间复杂度为O(n)。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
slow = 0
sum = 0
length = float("inf")
for fast in range(0, len(nums)):
sum += nums[fast]
while sum >= target:
length = min(length, fast - slow + 1)
sum -= nums[slow]
slow += 1
return 0 if length == float("inf") else length
Leetcode59. 螺旋矩阵 II
这条题目自己尝试了很久也没有调对,一开始是在循环不变量边界条件上卡了蛮久时间,后来把边界条件调对以后结果还是不对,并且发现输出的二维数组里每一行都是一样的,后来才发现是二维数组的初始化方式搞错了,一开始初始化写的是m = [[0]*n]*n
,后来自己测试了一下才知道这种初始化方式里更改其中一行的值会导致每行的值都被更改,具体的例子可以见这个链接:Python如何创建二维数组和初始化。把初始化方式改成m = [[0]*n for i in range(n)]
后就对了。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
l = n -1
number = 1
m = [[0]*n for i in range(n)]
startx = 0
starty = 0
while l > 0:
for j in range(starty, l):
m[startx][j] = number
number += 1
for i in range(startx, l):
m[i][j+1] = number
number += 1
for j in range(l, starty, -1):
m[i+1][j] = number
number += 1
for i in range(l, startx, -1):
m[i][starty] = number
number += 1
l -= 1
startx += 1
starty += 1
if n%2 == 1:
m[n//2][n//2] = n*n
return m