1.有序数组的平方(977)
1.1双指针法
一个包含负数的有序排列的数组,其平方的最大值一定是在数组的左右两边
所以用两个指针i 和 j, 分别指向数组的首和尾,比较首尾两个数字哪个平方更大,将大的那个写入新数组res之中, 由于要求新数组按照从小到大排列,所以按照由大到小的顺序排入新数组
如果是i边大, 那么将i对应大平方值写入序列号为k的res中,i ++且k--
如果是j边大,那么将j对应较大的平方值写入序号为k的res中, j-- 且 k--
这里要注意:
1. 初始res的方法 res = [float('inf')] * len(nums)
2. while循环时需要包含i = j这种情况, 否则i = j不会被写入res中,和题目意思不符合
res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
k = len(nums) - 1
j = k
i = 0
while i <= j:
if nums[i] * nums[i] > nums[j] * nums[j]:
res[k] = nums[i] * nums[i]
k -= 1
i += 1
else:
res[k] = nums[j] * nums[j]
k -= 1
j -= 1
return res
2.长度最小子数组(209)
2.1 暴力解法
固定开始位置, 依次循环终止位置, 遇到符合条件的就计算数组长度, 选出最小的数组长度并且记录
这里注意当我们已经找到了以当前 i
为起始位置的最短子数组, 继续循环只会找到更长的子数组,所以用break跳出内层循环,重新确定开始位置,找开始位置为起点的最短数组
l = len(nums)
min_len = float('inf')
for i in range (l):
sum1 = 0
for j in range (i, l):
sum1 += nums[j]
if sum1 >= target:
min_len = min(min_len, j-i+1)
break
return min_len if min_len != float('inf') else 0
2.2滑动窗口
滑动窗口即是固定终止位置, 移动起始位置
集合中所有元素和>=s后, 固定终止位置, 移动起始位置(left), 看总的sum减去left所在元素值以后是否仍然大于等于s. 以此来找到最短的符合条件的集合
这里编程时自己遇到的小问题是 right += 1是写在判断s之后的, 因为如果去掉一个left仍然满足大于s, 则right不需要任何移动
left = 0
right = 0
l = len(nums)
cur_sum = 0
min_len = float('inf')
while(right < l):
cur_sum += nums[right]
while(cur_sum >= target):
min_len = min(min_len, right-left+1)
cur_sum -= nums[left]
left += 1
right += 1
return min_len if min_len != float('inf') else 0
3.螺旋矩阵(59)
螺旋矩阵重要的是循环不变量,即循环一圈,对每条边的处理规则不变,这道题以左闭右开为例,横向为y轴,纵向为x轴
遵循只处理第一个,最后一个节点留给下一个循环处理的原则,作为下调变的起始位置. 并且用offset来记录终止位置,起始位置每圈也变化.
另外注意当n为奇数的时候,最后一个中间位置会空出,将最后一个值给它即可
这里用python语言实现还有几点注意
1. 初始化矩阵的时候,用这个代码 nums = [[0]*n for _ in range(n)]
2. 当从后往前循环的时候记得加上-1
3. 用一个loop变量计算循环次数,控制第一层循环
nums = [[0]*n for _ in range(n)]
startx = 0
starty = 0
loop = n//2
mid = n//2
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
offset += 1
if n % 2 != 0:
nums[mid][mid] = count
return nums