977.有序数组的平方
双指针法
原数组是一个可能有负数的非递减顺序数组,因此对其平方后最大值应当是两边往中间出现。使用双指针分别指向原数组两端,比较绝对值大小后,选取绝对值大的将其平方对输出数组从尾部开始递减放入。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left = 0
right = len(nums) - 1
new_nums = [0] * len(nums)
for i in range(len(nums)-1,-1,-1):
if abs(nums[left])>abs(nums[right]):
new_nums[i] = nums[left] ** 2
left += 1
else:
new_nums[i] = nums[right] ** 2
right -= 1
return new_nums
209.长度最小的子数组
双指针法/滑动窗口
我还是觉得叫双指针法理解起来方便一点(统一一下方法,方便理解)
一个指针负责遍历整个数组,并对其进行累加,当累加值大于目标值之后,开始滑动左边的指针,一个个减去左边的值,当两个指针内的元素总和又小于目标值之后,继续开始右指针的遍历。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
min_l = len(nums)+1
start = 0
win_sum = 0
for i in range(len(nums)):
win_sum += nums[i]
while(win_sum>=target):
min_l = min(min_l, i - start + 1)
win_sum -= nums[start]
start += 1
return min_l if min_l != len(nums)+1 else 0
59.螺旋矩阵
纯模拟的题目,主要是要找到规律
在这题中,需要遵循先左到右,再上到下,再右到左,再下到上的画图循环。
需要注意的是每次循环结束后,起始点x+=1,y+=1
,并且当n为奇数的时候,中间值不在循环逻辑中,需要单独赋值。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
num = 0
x = 0
y = 0
out = [[0]*n for _ in range(n)]
max = n**2
while (num<max):
if n == 1:
print(n,num,x,y)
num += 1
out[x][y] = num
break
else:
for i in range(n-1):
num += 1
out[x][y+i] = num
for j in range(n-1):
num += 1
out[x+j][y+n-1] = num
for i in range(n-1):
num += 1
out[x+n-1][y+n-1-i] = num
for j in range(n-1):
num += 1
out[x+n-1-j][y] = num
n -= 2
x += 1
y += 1
return out
总结
数组比较重要的感觉就算双指针法,别的都可以看作是双指针法的衍生。