1. 两数之和
- 给定一个非递减数组,从中找n个数,使之和为t
- 输入:[2,3,4,6,8],t=9,n=2
- 输出(3,6)的索引:(2,4)
- 思路:双指针,两数之和大于t时,说明右边的大数找不到更小的数配对了,右边大数可删除。这样一个处理包含的信息量为O(N)
1 | class Solution: |
2. 三数之和
- 给定一个数组,从中找出所有三元组满足和为t,重复三元组不算。
1 | class Solution: |
3. 盛最多水的容器
- 给定一个长度为
n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
1 | class Solution: |
4. 接雨水
- 给定
n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
1 | class Solution: |
1 | class Solution: |
5. 长度最小的子数组
(209) 给定一个含有
n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回0。输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。# 第一次遍历以2为右端点 2 -> 小于7,扩大 左边没有数了,无法扩大,说明以2为右端点无解,进行下一次迭代
1
2
3
4
5
6
7
- 思路:
- 暴力求解:遍历左端点或者右端点,以右端点为例。
# 第二次迭代,以3为右端点
3 -> 小于7,扩大
2,3 -> 小于7,扩大
左边没有数了,无法扩大,说明以3为右端点无解,进行下一次迭代
#
1 -> 小于7,扩大
3,1 -> 小于7,扩大
2,3,1 -> 小于7,扩大
无解
#
2 -> 小于7,扩大
1,2 -> 小于7,扩大
3,1,2 -> 小于7,扩大
2,3,1,2 -> 大于7,说明以2为右端点,得到的解为4
#...
1
2
3
- 优化求解,利用都是正数的性质,还是遍历右端点
# 第一次遍历以2为右端点
2 -> 小于7,扩大
左边没有数了,无法扩大,说明以2为右端点无解,进行下一次迭代
# 第二次迭代,以3为右端点
xxxxx 3 -> 小于7,扩大
上一步迭代得到的全串为2,直接在此基础上向右扩展右端点
2,3 -> 小于7,说明在第一次的全串(2)基础上扩展右端点(3)还是无法满足,进一步扩展右端点
2,3,1 -> 小于7,说明在第一次的全串(2,3)基础上扩展右端点(1)还是无法满足,进一步扩展右端点
2,3,1,2 -> 大于7,说明以2为右端点可以获得一个解,为了最短,尝试将左端点右移,发现3,1,2不满足,因此左端点不动,记录该长度为4,进一步扩展右端点
2,3,1,2,4 -> 由于上一步的结果大于7,这次右端点扩展了一个数,肯定大于7,需要缩短(固定右端点)以找到最短序列,尝试右移左端点,
3,1,2,4 -> 大于7,记录左边界更新(3),再次尝试右移左端点
1,2,4 -> 大于等于7,记录该长度为3,更新最优解,记录左边界更新(1),再次尝试右移左端点
2,4 -> 小于7,说明以4为右端点的情况已经遍历全了,回退一步:1,2,4,进一步扩展右端点
1,2,4,3 -> 由于上一步的结果大于7,这次右端点扩展了一个数,肯定大于7,需要缩短(固定右端点)以找到最短序列
2,4,3 -> 大于等于7,记录该长度为3,更新最优解,记录左边界更新(2),再次缩短
4,3 -> 大于等于7,记录该长度为2,更新最优解,记录左边界更新(4),再次缩短
3 -> 小于7,说明以3为右端点的情况已经遍历全了,回退一步:3,4,进一步扩展右端点
# 遍历完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
```python
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n = len(nums)
res = n+1
sum = 0
left = 0
for right,x in enumerate(nums):
sum += x
while sum - nums[left] >= target:
sum -= nums[left]
left += 1
res = min(res, right-left+1) if sum >= target else res
return res if res <=n else 0