On this page
เทคนิคที่เจอบ่อย (Common Patterns)
Two pointers, sliding window และ hash map — สามเทคนิคที่ลด complexity และแก้โจทย์สัมภาษณ์ได้ครึ่งค่อนข้อ
เมื่อเข้าใจพื้นฐานแล้ว สิ่งที่ทำให้แก้โจทย์ได้เร็วคือการจำ "pattern" ที่ใช้ซ้ำได้ หัวข้อนี้รวม 3 เทคนิคที่ทรงพลังที่สุดสำหรับมือใหม่ และเป็นสะพานไปสู่การเตรียม coding interview จริง
1) Two Pointers — สองตัวชี้
ใช้ตัวชี้สองตัววิ่งเข้าหากันหรือไปด้วยกัน เหมาะกับข้อมูลที่เรียงแล้ว หรือการเช็คจากสองด้าน ช่วยลดจาก loop ซ้อน O(n²) เหลือ O(n)
# เช็คพาลินโดรมด้วยตัวชี้หัว-ท้าย
def is_palindrome(s):
i, j = 0, len(s) - 1
while i < j:
if s[i] != s[j]:
return False
i, j = i + 1, j - 1 # ขยับเข้าหากัน
return True
print(is_palindrome("level")) # True
# หาคู่ที่บวกกันได้ target ในลิสต์ที่เรียงแล้ว
def two_sum_sorted(arr, target):
i, j = 0, len(arr) - 1
while i < j:
s = arr[i] + arr[j]
if s == target:
return (arr[i], arr[j])
elif s < target:
i += 1 # ผลรวมน้อยไป ขยับซ้ายขึ้น
else:
j -= 1 # ผลรวมมากไป ขยับขวาลง
return None
print(two_sum_sorted([1, 3, 5, 7, 9], 12)) # (3, 9)2) Sliding Window — หน้าต่างเลื่อน
ใช้กับโจทย์หา subarray/substring ต่อเนื่องที่ "ดีที่สุด" เช่นผลรวมมากสุดของช่วงยาว k แทนที่จะคำนวณใหม่ทุกช่วง เราเลื่อนหน้าต่างและปรับค่าทีละนิด ลดจาก O(n×k) เหลือ O(n)
# หาผลรวมมากสุดของ subarray ความยาว k
def max_sum_k(arr, k):
window = sum(arr[:k]) # ผลรวมหน้าต่างแรก
best = window
for i in range(k, len(arr)):
window += arr[i] - arr[i - k] # เพิ่มตัวใหม่ ลบตัวเก่า
best = max(best, window)
return best
print(max_sum_k([2, 1, 5, 1, 3, 2], 3)) # 9 (5+1+3)3) Hash Map — จำเพื่อค้นหาเร็ว
ใช้ dict/set จำสิ่งที่เคยเห็น ทำให้ค้นหาเร็ว O(1) เปลี่ยนหลายโจทย์จาก O(n²) เป็น O(n) โจทย์คลาสสิกคือ Two Sum (เวอร์ชันไม่เรียง)
# Two Sum: หา index ของคู่ที่บวกได้ target
def two_sum(nums, target):
seen = {} # ค่า -> index ที่เคยเห็น
for i, num in enumerate(nums):
need = target - num
if need in seen: # เคยเห็นตัวที่ต้องการแล้ว
return [seen[need], i]
seen[num] = i
return []
print(two_sum([2, 7, 11, 15], 9)) # [0, 1] (2 + 7)
# เช็คว่ามีค่าซ้ำไหม ด้วย set — O(n)
def has_dup(nums):
return len(set(nums)) != len(nums)
print(has_dup([1, 2, 3, 2])) # Trueจับสัญญาณว่าโจทย์ใช้ pattern ไหน
ทักษะแก้โจทย์เร็วคือเห็นโจทย์แล้วนึกออกว่าจะใช้เทคนิคไหน ฝึกจนจำสัญญาณเหล่านี้ได้
| เจอลักษณะนี้ในโจทย์ | มักใช้ |
|---|---|
| array เรียงแล้ว / หาคู่ / palindrome | Two pointers |
| subarray/substring ต่อเนื่อง ยาว/สั้นที่สุด | Sliding window |
| นับ / หาตัวซ้ำ / "เคยเห็นไหม" / จับคู่ | Hash map / set |
| ค้นหาในข้อมูลที่เรียงแล้ว | Binary search |
| ลองทุกความเป็นไปได้ / โครงสร้างซ้ำตัวเอง | Recursion / backtracking |
สรุปบทที่ 4
- Two pointers: ตัวชี้สองตัวบนข้อมูลเรียงแล้ว/เช็คสองด้าน — ลด O(n²) เป็น O(n)
- Sliding window: เลื่อนหน้าต่างปรับค่าทีละนิด สำหรับ subarray/substring ต่อเนื่อง
- Hash map/set: จำสิ่งที่เคยเห็น ค้นหา O(1) เปลี่ยนหลายโจทย์เป็น O(n)
- จำสัญญาณในโจทย์เพื่อเลือก pattern ได้เร็ว
1) ใช้ two pointers ลบค่าซ้ำออกจากลิสต์ที่เรียงแล้ว 2) หาผลรวมมากสุดของ subarray ยาว k ด้วย sliding window 3) แก้ Two Sum ด้วย dict 4) เช็คว่าสองคำเป็น anagram กันไหม (ใช้ Counter/sorted) 5) หาตัวอักษรตัวแรกที่ไม่ซ้ำในข้อความ (ใช้ dict นับ)
คุณเข้าใจการคิดเชิงอัลกอริทึม วัดประสิทธิภาพด้วย Big-O และรู้จัก pattern หลักแล้ว นี่คือรากฐานตรงสู่การฝึก LeetCode ในส่วนเตรียมสัมภาษณ์ ลองแวะดูหน้า Algorithms Cheatsheet เพื่อต่อยอด