基本概念
双指针:在区间操作时,利用两个下标同时遍历,进行高效操作
双指针利用区间性质可以把0(n2)时间降低到0(n)
蓝桥532
import os
import sys
# 请在此输入您的代码
w = int(input())
n = int(input())
b = []
ans = 0
for i in range(n):
b.append(int(input()))
b.sort()
l, r = 0, len(b) - 1
while True:
if l == r:
ans += 1
break
if l > r:
break
if b[l] + b[r] > w:
ans += 1
r -= 1
else:
ans += 1
r -= 1
l += 1
print(ans)
同向扫描:也被称为滑动窗口,始终维护一个[lef,right]的区间
维护[left,right]区间中的信息:区间和、各个元素个数等
左端点往右移动表示删除元素
右端点往右移动表示增加元素
当移动到尾部则停止,或满足特殊条件时停止
蓝桥1372
n, s = map(int, input().split())
a = list(map(int, input().split()))
l, r = 0, 0
ans = n + 1
total = 0
while l < n:
while r < n and total < s:
total += a[r]
r += 1
if total >= s:
ans = min(ans,r-l)
total -= a[l]
l += 1
if ans == n + 1:
ans = 0
print(ans)
蓝桥1621
import os
import sys
# 请在此输入您的代码
n, m, k = map(int, input().split())
a = list(map(int, input().split()))
cnt = 0
l, r = 0, 0
ans = 0
while l < n:
while r < n and cnt < k:
if a[r] >= m:
cnt += 1
r += 1
if cnt >= k:
ans += (n - 1) - (r - 2)
if a[l] >= m:
cnt -= 1
l += 1
print(ans)
蓝桥3695
import os
import sys
# 请输入你的代码
def sol(m):
l,r,res = 0,n-1,0
while l<r:
while l<r and a[l]+a[r]>m: # 容斥定理 找到小于等于m的数
r-=1
res+=(r-l)
l+=1
return res
def printf():
global n,L,R,a
n,L,R = map(int,input().split())
a = list(map(int,input().split()))
a.sort()
print(sol(R)-sol(L-1)) # 找到小于等于R的数字个数和小于等于L-1的数字个数之差就是结果
printf() # 利用了容斥定理