leetcode977.有序数组的平方
思路:因为数组是非降序的,所以平方后较大的数一定出现在数组的两边,所以平方后从两边开始使用双指针可以得到一个由小到大的数组
代码:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
vector = [float('inf')] * len(nums) #创建新列表存放数组
i = 0
j = len(nums) - 1
k = len(nums) - 1
while i <= j:
if nums[i] * nums[i] < nums[j] * nums[j]:
vector[k] = nums[j] * nums[j]
j -= 1
k -= 1
else:
vector[k] = nums[i] * nums[i]
i += 1
k -= 1
return vector
leetcode 209.长度最小的子数组
思路:确定终止位置,移动起始位置,窗口内是满足条件的子数组,当窗口内子数组满足条件时,向前移动起止位置,终止位置需要遍历整个数组。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
l = len(nums)
left = 0
right = 0
min_len = float('inf') #存当前最小长度
sum = 0 #存当前的和
while right < l:
sum += nums[right]
while sum >= target:
min_len = min(min_len, right - left + 1)
sum -= nums[left]
left += 1
right += 1
return min_len if min_len != float('inf') else 0
leetcode 59.螺旋矩阵II
思路:思路有点混乱,需要再消化一下
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)]
startx = 0
starty = 0
loop = n // 2 #迭代次数,也就是转几圈
mid = n // 2 #n为奇数时,矩阵的中心点
count = 1 #计数
for offset in range(1, loop + 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:
nums[mid][mid] = count
return nums