977. 有序数组的平方 - 力扣(LeetCode)
一开始没想出来怎么用双指针,直接爆破
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
nums_2 = [x**2 for x in nums]
nums_2 = sorted(nums_2)
return nums_2
方法二 双指针(左右指针)
因为题目给的数组是非递减顺序,所以两边的平方一般比中间大(存在负数)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
result = nums.copy()
k = -1
left = 0
right = len(nums)-1
while left <= right:
if nums[left]**2 > nums[right]**2:
result[k] = nums[left]**2
left = left+1
else:
result[k] = nums[right]**2
right = right-1
k = k-1
return result
- 第一种速度比第二种快,为什么?
209. 长度最小的子数组 - 力扣(LeetCode)
一开始想写从起始点开始的双指针,边界太难找,没成功
滑动窗口
class Solution(object):
def minSubArrayLen(self, target, nums):
i = 0
sum = 0
result = len(nums) + 1
for j in range(len(nums)):
sum = sum + nums[j]
while sum >= target:
sub_l = j-i+1
result = min(result, sub_l)
sum = sum - nums[i]
i = i+1
if result == len(nums) + 1:
result = 0
return result
*和原本爆破方法不同,滑动窗口区间由少到多判断,爆破区间由多到少判断,所以一个for就可以解决。
59. 螺旋矩阵 II
看到题目完全没思路,直接看题解
解题思路
一圈一圈从里到外循环,注意边界处理方法统一
方法一
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
star_x, star_y = 0, 0
offset = 1
count = 1
matrix = [[0] * n for _ in range(n)]
for quan in range(n//2):
i = star_x
j = star_y
while j < n-offset:
matrix[i][j] = count
count = count+1
j = j+1
while i < n-offset:
matrix[i][j] = count
count = count+1
i = i+1
while j > offset-1:
matrix[i][j] = count
count = count + 1
j = j-1
while i > offset-1:
matrix[i][j] = count
count = count+1
i = i-1
star_x = star_x + 1
star_y = star_y + 1
offset = offset + 1
if n % 2 == 1:
matrix[n//2][n//2] = count
return matrix
- python 刷题的时候不要用numpy库
:type n: int :rtype: List[List[int]] #题目中参数类型明确给了,不要自己重新定义