Notes & software courses · Free to learn
Aph's Blog
On this page

เทคนิคที่เจอบ่อย (Common Patterns)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

Two pointers, sliding window และ hash map — สามเทคนิคที่ลด complexity และแก้โจทย์สัมภาษณ์ได้ครึ่งค่อนข้อ

เมื่อเข้าใจพื้นฐานแล้ว สิ่งที่ทำให้แก้โจทย์ได้เร็วคือการจำ "pattern" ที่ใช้ซ้ำได้ หัวข้อนี้รวม 3 เทคนิคที่ทรงพลังที่สุดสำหรับมือใหม่ และเป็นสะพานไปสู่การเตรียม coding interview จริง

1) Two Pointers — สองตัวชี้

ใช้ตัวชี้สองตัววิ่งเข้าหากันหรือไปด้วยกัน เหมาะกับข้อมูลที่เรียงแล้ว หรือการเช็คจากสองด้าน ช่วยลดจาก loop ซ้อน O(n²) เหลือ O(n)

python
# เช็คพาลินโดรมด้วยตัวชี้หัว-ท้าย
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)

python
# หาผลรวมมากสุดของ 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 (เวอร์ชันไม่เรียง)

python
# 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 เรียงแล้ว / หาคู่ / palindromeTwo 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 นับ)

จบบทที่ 4 — พร้อมต่อยอด

คุณเข้าใจการคิดเชิงอัลกอริทึม วัดประสิทธิภาพด้วย Big-O และรู้จัก pattern หลักแล้ว นี่คือรากฐานตรงสู่การฝึก LeetCode ในส่วนเตรียมสัมภาษณ์ ลองแวะดูหน้า Algorithms Cheatsheet เพื่อต่อยอด