On this page
เทคนิคสัมภาษณ์ (Patterns)
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)
เฉลย + คำอธิบาย
# วิธีช้า 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)
เฉลย + คำอธิบาย
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")
เฉลย + คำอธิบาย
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)
เฉลย + คำอธิบาย
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 ที่ฝึกมาทั้งหมด