1. 反向扫描
反向扫描的两个指针 i、j,指针 i 从左向右扫描,指针 j 从右向左扫描,在中间 i < j 处相
遇并停止扫描。反向扫描比同向扫描简单。
题目:回文数判定
import os
import sys
s=input()
if s==s[::-1]:
print('Y')
else:
print('N')
2. 同向扫描
题目:美丽的区间
第一种方法:暴力,不能过全部的数据
import os
import sys
n,S=map(int,input().split())
a=list(map(int,input().split()))
ok=n+1
for i in range(n):
for j in range(i,n):
if j-i+1 < ok:
if sum(a[i:j+1]) >= S:
ok=j-i+1
if ok==n+1:
print(0)
else:
print(ok)
第二种方法:双指针,同向扫描
import os
import sys
n,S=map(int,input().split())
a=list(map(int,input().split()))
ok=n+1
i=0
j=0
sum_ = 0
while i < n:
if sum_ < S:
sum_ = sum_ + a[i]
i=i+1
elif sum_ >= S:
ok = min(i-j,ok)
sum_ = sum_ - a[j]
j=j+1
if ok==n+1:
print(0)
else:
print(ok)
题目:日志统计
import os
import sys
from bisect import bisect_left
N,D,K=map(int,input().split())
a=[[] for i in range(int(1e5+10))]
post=set()
for i in range(N):
ts,id_=map(int,input().split())
post.add(id_)
a[id_].append(ts)
post=sorted(post)
for i in post:
a[i]=sorted(a[i])
for j in range(len(a[i])):
td = a[i][j]+D
if(bisect_left(a[i],td)-j >= K):
print(i)
break