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

เทคนิคสัมภาษณ์ (Patterns)

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

Two pointers, sliding window และ hash map — โจทย์สัมภาษณ์จริงพร้อมเฉลยที่อธิบายว่าทำไมเร็วขึ้น

หัวข้อสุดท้ายคือโจทย์ระดับสัมภาษณ์จริง ที่แก้ด้วย 3 เทคนิคทรงพลัง โจทย์เหล่านี้คือเวอร์ชันง่ายของที่เจอใน LeetCode ทุกข้อมีทั้งวิธีตรงไปตรงมา (ช้า) และวิธีที่ใช้ pattern (เร็ว) ให้เทียบกัน

ข้อ 1 — Two Sum 🟡 (Hash Map)

หา index ของเลข 2 ตัวในลิสต์ที่บวกกันได้ค่า target เช่น [2,7,11,15] target=9 → [0,1] (เพราะ 2+7=9)

เฉลย + คำอธิบาย
python
# วิธีช้า O(n²): วนทุกคู่
def two_sum_slow(nums, target):
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]

# วิธีเร็ว O(n): ใช้ dict จำสิ่งที่เคยเห็น
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]

แทนที่จะวนหาคู่ทุกแบบ (O(n²)) เราถามว่า "ต้องการเลขอะไรถึงจะครบ target" (need = target - num) แล้วเช็คใน dict ว่าเคยเห็นไหม (O(1)) เปลี่ยนทั้งโจทย์เป็น O(n) — นี่คือเหตุผลที่ hash map ทรงพลัง

ข้อ 2 — ผลรวมมากสุดของช่วงยาว k 🟡 (Sliding Window)

หาผลรวมมากสุดของ subarray ต่อเนื่องความยาว k เช่น [2,1,5,1,3,2] k=3 → 9 (จาก 5+1+3)

เฉลย + คำอธิบาย
python
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

วิธีตรง ๆ คือคำนวณผลรวมทุกช่วงใหม่ (O(n×k)) แต่ sliding window สังเกตว่าช่วงถัดไปต่างจากช่วงเดิมแค่ "เพิ่มตัวขวา ลบตัวซ้าย" จึงปรับทีละนิด ไม่ต้องบวกใหม่ทั้งหมด เหลือ O(n)

ข้อ 3 — Substring ยาวสุดไม่มีตัวซ้ำ 🔴 (Sliding Window + Set)

หาความยาวของ substring ที่ยาวที่สุดซึ่งไม่มีตัวอักษรซ้ำ เช่น "abcabcbb" → 3 ("abc")

เฉลย + คำอธิบาย
python
def longest_unique(s):
    seen = set()
    left = 0
    best = 0
    for right in range(len(s)):
        while s[right] in seen:    # มีตัวซ้ำ หดหน้าต่างจากซ้าย
            seen.remove(s[left])
            left += 1
        seen.add(s[right])
        best = max(best, right - left + 1)
    return best

print(longest_unique("abcabcbb"))  # 3
print(longest_unique("bbbbb"))     # 1

หน้าต่างขยายขวา (right) เรื่อย ๆ ถ้าเจอตัวซ้ำก็หดซ้าย (left) จนไม่ซ้ำ set จำว่าตัวไหนอยู่ในหน้าต่าง ความยาวหน้าต่าง = right - left + 1 เป็นการผสม sliding window กับ set — โจทย์ LeetCode ยอดนิยมที่ดูยากแต่ pattern ชัด

ข้อ 4 — Two Sum บนลิสต์เรียงแล้ว 🟡 (Two Pointers)

ลิสต์เรียงแล้ว หาคู่ที่บวกได้ target เช่น [1,3,5,7,9] target=12 → (3,9)

เฉลย + คำอธิบาย
python
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)

เพราะลิสต์เรียงแล้ว เราใช้ตัวชี้หัว (i) และท้าย (j): ถ้าผลรวมน้อยไปก็ขยับ i ขึ้น (ได้ค่ามากขึ้น) ถ้ามากไปก็ขยับ j ลง ค่อย ๆ บีบเข้าหากัน O(n) ไม่ต้องใช้หน่วยความจำเพิ่มเหมือน hash map

สรุป: เลือก pattern จากสัญญาณในโจทย์

เจอลักษณะนี้ใช้ patternตัวอย่างข้อ
จับคู่ / นับ / "เคยเห็นไหม"Hash map / setข้อ 1, 3
subarray/substring ต่อเนื่องSliding windowข้อ 2, 3
ลิสต์เรียงแล้ว / หาคู่ / สองด้านTwo pointersข้อ 4
ก้าวต่อไปสู่สัมภาษณ์จริง

ถ้าทำชุดนี้ได้ คุณพร้อมเริ่มฝึก LeetCode แล้ว ไปต่อที่ส่วนเตรียม Coding Interview เพื่อดู study plan, NeetCode 150 และเทคนิคทำข้อสอบ — โจทย์ที่นั่นคือเวอร์ชันเต็มของ pattern ที่ฝึกมาทั้งหมด