python | 区间问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值