SevdanurGenc's picture
Upload 60 files
63f6453 verified
Raw History Blame Contribute Delete
1.8 kB
"""Kapalı aralıklar [baş, son] üzerinde işlemler."""
from typing import List, Tuple
Interval = Tuple[int, int]
def validate(iv: Interval) -> None:
if len(iv) != 2:
raise ValueError("aralık iki elemanlı olmalı")
if iv[0] > iv[1]:
raise ValueError(f"geçersiz aralık: {iv}")
def merge(intervals: List[Interval]) -> List[Interval]:
"""Çakışan veya bitişik (ör. [1,3] ve [4,5]) aralıkları birleştirir."""
for iv in intervals:
validate(iv)
result: List[Interval] = []
for start, end in sorted(intervals):
if result and start <= result[-1][1] + 1:
result[-1] = (result[-1][0], max(result[-1][1], end))
else:
result.append((start, end))
return result
def total_length(intervals: List[Interval]) -> int:
"""Birleştirilmiş aralıkların kapsadığı tam sayı adedi."""
return sum(end - start + 1 for start, end in merge(intervals))
def contains(intervals: List[Interval], x: int) -> bool:
lo, hi = 0, len(merged := merge(intervals)) - 1
while lo <= hi:
mid = (lo + hi) // 2
s, e = merged[mid]
if x < s:
hi = mid - 1
elif x > e:
lo = mid + 1
else:
return True
return False
def gaps(intervals: List[Interval], lower: int, upper: int) -> List[Interval]:
"""[lower, upper] içinde hiçbir aralığın kapsamadığı boşluklar."""
if lower > upper:
raise ValueError("lower > upper")
out: List[Interval] = []
cur = lower
for s, e in merge(intervals):
if e < lower or s > upper:
continue
if s > cur:
out.append((cur, s - 1))
cur = max(cur, e + 1)
if cur <= upper:
out.append((cur, upper))
return out