双指针(复习)

基本概念

双指针:在区间操作时,利用两个下标同时遍历,进行高效操作

双指针利用区间性质可以把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()                     # 利用了容斥定理

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值