الگوی دو اشارهگر (Two Pointers)
الگوی دو اشارهگر: جفتیابی در آرایه مرتب، معکوسسازی درجا، حذف تکراریها و سهتایی با جمع صفر
ایده الگو
دو اشارهگر (Two Pointers) دو اندیس (معمولاً از دو سر) روی داده حرکت میدهند و جستجوی O(n²) را به O(n) تبدیل میکنند. شرط طلایی: داده مرتب باشد (یا مرتبکردن منطقی باشد).
چرا جواب میدهد؟
در آرایه مرتب با اشارهگر چپ و راست:
- جمع کمتر از هدف ← فقط چپ جلو برود (راست را کم کن؟ نه! جمع کمتر میشود)
- جمع بیشتر ← فقط راست عقب بیاید
هر گام، دستکم یک عنصر را «قطعاً جواب نیست» حذف میکند — پس حداکثر n گام!
سه شکل رایج
| شکل | کاربرد | مثال |
|---|---|---|
| از دو سر به هم | آرایه مرتب + جفت | Two Sum II |
| کند و تند (مبحث جدا) | لیست پیوندی، حلقه | وسط لیست |
| هممبدأ (i و j) | مقایسه/ادغام | حذف تکراری، merge |
مسائل کلاسیک
- Two Sum در آرایه مرتب: جفت با جمع هدف
- معکوسسازی آرایه درجا: چپ و راست جابهجا، به هم برسند
- حذف تکراریها: اشارهگر کند (آخرِ بخش یکتا) و تند (اسکن)
- سهتایی با جمع صفر: یک عنصر ثابت + Two Sum روی بقیه!
- ظرف با بیشترین آب: حرکت از عریضترین، جلو رفتن از کوتاهتر
الگوی کد
left, right = 0, len(arr) - 1
while left < right:
if شرط_برقرار(arr[left], arr[right]):
# جواب پیدا شد یا ثبت کن
...
elif نیاز_بزرگتر:
left += 1
else:
right -= 1
نکته مصاحبه: اگر آرایه مرتب نیست و ایندکس اصلی لازم است، یا اول مرتب کنید و ایندکسها را نگه دارید، یا از هش استفاده کنید — این نکته را حتماً بگویید!
جمعبندی
- دو اشارهگر از دو سر + داده مرتب = O(n)
- هر گام یک گزینه را قطعاً حذف میکند
- سهتایی = حلقه + Two Sum داخلی: O(n²)
- نشانه: «آرایه مرتب + جفت/سهتایی با شرط»
این مبحث بخشی از دوره آموزش کامل الگوریتمها است.