5. Ikki ko‘rsatkich va sirpanuvchi oyna
Nazariya
Fikr
Ichma-ich ikkita sikl O(n²) beradi. Ko‘p masalada esa ikkinchi indeks
orqaga qaytmaydi — u faqat oldinga siljiydi. Shunda ikkala indeks
ham jami n martadan ko‘p siljimaydi va murakkablik O(n) bo‘ladi.
Saralangan massivda juftlik
Yig‘indisi S ga teng juftlikni topamiz:
chap, ong = 0, len(a) - 1
while chap < ong:
s = a[chap] + a[ong]
if s == S:
print(a[chap], a[ong]); break
if s < S:
chap += 1 # yig‘indi kichik — kattaroq son kerak
else:
ong -= 1 # yig‘indi katta — kichikroq son kerakSirpanuvchi oyna
Oyna — massivning uzluksiz bo‘lagi. O‘ng chegara oldinga siljiydi,
shart buzilsa chap chegara ham siljiydi:
# yig‘indisi K dan oshmaydigan eng uzun bo‘lak
chap = 0
joriy = 0
javob = 0
for ong in range(n):
joriy += a[ong]
while joriy > K:
joriy -= a[chap]
chap += 1
javob = max(javob, ong - chap + 1)Har bir element oynaga bir marta kiradi va bir marta chiqadi — demak
O(n).
Qachon ishlaydi
- massiv saralangan yoki tartib muhim bo‘lganda;
- oyna kengaysa shart faqat «yomonlashsa» (monotonlik);
- uzluksiz bo‘lak (subarray) haqida so‘ralganda.
Manfiy sonlar bo‘lsa, «yig‘indi bo‘yicha oyna» buziladi — u yerda
prefiks yig‘indi yoki boshqa usul kerak.
Misol
n, K = map(int, input().split())
a = list(map(int, input().split()))
chap = joriy = javob = 0
for ong in range(n):
joriy += a[ong]
while joriy > K:
joriy -= a[chap]
chap += 1
javob = max(javob, ong - chap + 1)
print(javob)
Mashq masalalari
| ✓ | Kod | Masala | Qiyinlik |
|---|---|---|---|
| AL05-1 | Yig‘indisi x ga teng juftliklar | Boshlang‘ich | |
| AL05-2 | Eng yaxshi hafta | Boshlang‘ich | |
| AL05-3 | Byudjet | O‘rta | |
| AL05-4 | Takrorsiz bo‘lak | O‘rta | |
| AL05-5 | Ikki ro‘yxatni birlashtirish | Boshlang‘ich |