基本概念
双指针:在区间操作时,利用两个下标同时遍历,进行高效操作
双指针利用区间性质可以把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 += 1breakif l > r:breakif b[l] + b[r] > w:ans += 1r -= 1else:ans += 1r -= 1l += 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 += 1if total >= s:ans = min(ans,r-l)total -= a[l]l += 1if 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 += 1r += 1if cnt >= k:ans += (n - 1) - (r - 2)if a[l] >= m:cnt -= 1l += 1print(ans)
蓝桥3695
import os
import sys
# 请输入你的代码
def sol(m):l,r,res = 0,n-1,0while l<r:while l<r and a[l]+a[r]>m: # 容斥定理 找到小于等于m的数r-=1res+=(r-l)l+=1return res
def printf():global n,L,R,an,L,R = map(int,input().split())a = list(map(int,input().split()))a.sort()print(sol(R)-sol(L-1)) # 找到小于等于R的数字个数和小于等于L-1的数字个数之差就是结果
printf() # 利用了容斥定理