977 有序数组的平方
问题描述:给定一个有序数组,返回这个数组中元素平方的排序
解决思路1:先平方,快排-时间复杂度为O(nlogn)
解决思路2:双指针的思想
如何能够想到双指针的思想:平方之后最大元素一定是在两边,所以可以用两个指针逐步向中间靠拢的过程来实现排序,中心思路是先更新最大,再更新次大的元素。
# 首先定义一个数组存放排序后的数据
result = list(range(0,len(nums))
k = numsize
i,j = 0,len(nums)-1
# 分别判断将那个位置上的数值更新在result列表中
while k>=0:
if nums[j]**2 > num[i]**2:
result[k] = nums[j]**2
j -= 1
else:
result[k] = nums[i]**2
i += 1
return temp
209 长度最小的子数组
问题描述:已知一个数组取出这个数组中,最小的数组,加和需要大于nums的值
解决思路1【暴力解法】分别遍历所有的组合最终找到长度最小的组合。
解决思路2【滑动窗口】
滑动窗口的思路:起始位置如何移动是滑动窗口中的核心思路,
①定义需要维护的变量,②定义窗口首末端,③更新需要维护的变量,④移动相应的指针
left = 0
right = 0
sum_ = 0
min_len = math.inf
# 终止条件为右端的指针需要小于数组的长度
while right<=len(nums):
sum_ += nums[right]
while sum_ > target:
min_len = min(right-start+1,min_len)
sum_ -= nums[left]
left += 1
right += 1
return min_len
相关题目:
904思路:哈希表+滑动窗口
59 螺旋矩阵II
注意:四个点的边界条件
循环不变量的原则:对每条边的处理规则是不变的,转一圈坚持的一个原则
top = 0
bottom = n-1
left = 0
right = n-1
i,j = 0,0
count = 1
temp = [[0 for i in range(n)] for i in range(n)]
while count<=n**2:
# left to right,将角落的值放在上一步进行处理
for j in range(left,right+1,1):
temp[i][j] = count
count += 1
top += 1
# top to bottom
for i in range(top,bottom+1,1):
temp[i][j] = count
count += 1
right -= 1
for j in range(right,left-1,-1):
temp[i][j] = count
count += 1
bottom -= 1
for i in range(bottom,top-1,-1):
temp[i][j] = count
count += 1
left += 1
return temp
总结:
- 二分法:查找元素的下标
- 双指针:删除元素、规律排序
- 滑动窗口:需要设置初始的变量,后续根据窗口的值对变量值进行更新
- 模拟方法:通过设定边界条件达到最优值,找到循环不变量(左闭右闭,还是左闭右开,到底要不要先对上一步的数据进行处理)