有序数组
解题思路:
1、有序数组,最大的值一定在两端,所以直接用双指针比较两端的地址谁大就可以了。
2、较大的一方,放在新数组的最后一个为止
3、i=j,想一下只有一个元素的场景,就可以推断出i可以等于j
4、右侧数比较大的时候,将右侧的平方更新新数组中,并向左-1.其他时候,将左侧的数字更新到数组中,并向右+1即可。i=j的时候一样,谁放里都行,所以直接else 包含了相等的情况
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
i, j, k = 0, n-1, n-1
res = [-1] * n /
while i <= j:
lm = nums[i] ** 2
rm = nums[j] ** 2
if lm > rm :
res[k] = lm
i += 1
else:
res[k] = rm
j -= 1
k-=1
return res
寻找长度最小的子数组
解题思路:
用j去遍历,让他成为右边窗口的临界值
i控制左边窗口的值。
在遍历过程中记录窗口的最小值res
若达到了和大于等于target的标准,则左边窗口向左滑动一个,并在sum中去除出了滑动窗口的值
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
# 定义一个无限大的数
res = float("inf")
i =j= 0
sum=0
while j<len(nums):
sum+=nums[j]
while sum>=s:
res=min(res,j-i+1)
sum-=nums[i]
i+=1
j+=1
if res ==float("inf"):
return 0
else:
return res