Panduan Ringkas Pengecaman Corak
Petakan 15 petunjuk masalah lazim (tatasusunan terisih, perlu semua kombinasi, maksimumkan nilai dengan kekangan dan sebagainya) kepada corak algoritma yang menyelesaikannya paling pantas.
Panduan Ringkas Pengecaman Corak ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Permainan Pengecaman Corak 60 Saat
Dalam temu duga sebenar, anda mempunyai kira-kira 60 saat selepas membaca sesuatu masalah untuk mengenal pasti corak algoritma yang sesuai sebelum penemu duga menjangkakan anda mula menulis kod. Ini ialah kemahiran paling penting untuk dibangunkan — bukan menghafal pelaksanaan, tetapi mengenal pasti alat yang patut digunakan.
Pengecaman corak terhasil daripada pemetaan isyarat masalah (perkataan dan kekangan dalam pernyataan masalah) kepada keluarga algoritma yang diketahui. Setelah anda mengenal pasti corak itu, pelaksanaan menjadi latihan mengisi templat. Pelajaran ini ialah helaian rujukan sistematik tentang 15 isyarat masalah yang paling lazim dan corak yang sepadan dengannya.
# The recognition process
recognition_steps = [
'1. Read the problem once fully (do not start coding)',
'2. Identify the data structure: array, string, tree, graph, matrix?',
'3. Identify the ask: find min/max, count ways, enumerate, detect cycle...?',
'4. Note the constraint: n<=20 (bitmask), sorted (binary search), DAG (topo sort)?',
'5. Map signal -> pattern',
'6. State the pattern and complexity to the interviewer before coding',
'7. Handle edge cases mentally before writing',
]
for step in recognition_steps:
print(step)Isyarat 1-3: Corak Tatasusunan dan Rentetan
Isyarat masalah yang paling kerap bagi tatasusunan dan rentetan:
- Tatasusunan diisih + cari sasaran → Carian binari O(log n)
- Cari pasangan/tiga serangkai yang jumlahnya sama dengan sasaran → Dua penuding O(n) jika diisih, peta cincang O(n) jika tidak diisih
- Subtatasusunan/subrentetan terpanjang/terpendek yang memenuhi syarat → Tetingkap gelongsor O(n)
- Jumlah maksimum/minimum subtatasusunan bersebelahan → Algoritma Kadane O(n)
- Pengesanan pendua → Set cincang O(n) atau sort O(n log n)
Jika tatasusunan diisih, sentiasa pertimbangkan carian binari dahulu. Tidak diisih + jumlah sasaran + O(n) = hampir sentiasa peta cincang untuk carian pelengkap.
# Quick recognition: array/string signals
signals = [
('Sorted array, find element', 'Binary search O(log n)'),
('Find two elements summing to K', 'Sort+two-ptr O(n log n) or hash O(n)'),
('Longest subarray with property P', 'Sliding window (variable size) O(n)'),
('Max sum contiguous subarray', 'Kadane algorithm O(n)'),
('Anagram/permutation check', 'Frequency map (Counter) O(n)'),
('Contains duplicate', 'Hash set O(n)'),
('Merge two sorted arrays/lists', 'Two pointers O(n+m)'),
('Rotate / shift array', 'Reverse trick O(n) in-place'),
('Next permutation', 'Find rightmost ascent + swap + reverse'),
('Maximum product subarray', 'Track max and min (handles negatives)'),
]
for signal, pattern in signals:
print(f'{signal:45s} => {pattern}')Isyarat 4-6: Corak Pepohon dan Graf
Isyarat masalah pepohon dan graf serta coraknya:
- Lintasan aras demi aras / laluan terpendek dalam graf tidak berwajaran → BFS dengan baris gilir dwihujung O(V+E)
- Terokai semua laluan / pengesanan kitaran / susunan DFS → DFS secara rekursif atau beriterasi O(V+E)
- BST + sifat tertib dalam (elemen ke-k, susunan terisih) → DFS tertib dalam O(n)
- Leluhur sepunya terendah → Penurunan rekursif dengan penjejakan laluan O(n)
- Komponen bersambung / gabungkan dua kumpulan → DSU O(n × α(n))
# Tree/graph signal recognition
tree_graph_signals = [
('Level-order / minimum depth / word ladder', 'BFS with deque'),
('All paths / path sum / all permutations tree', 'DFS recursive'),
('Cycle detection (undirected)', 'DFS with parent / DSU'),
('Cycle detection (directed) / course schedule', 'DFS three-color / Kahn topo sort'),
('Shortest path weighted graph', 'Dijkstra (non-neg) / Bellman-Ford (neg)'),
('All-pairs shortest path', 'Floyd-Warshall O(V^3)'),
('Topological order', 'Kahn BFS topo sort'),
('Min spanning tree', 'Kruskal (DSU) / Prim (heap)'),
('Dynamic connectivity / union-find', 'DSU path compression + union by rank'),
('Autocomplete / prefix search', 'Trie'),
('BST kth smallest / range sum', 'In-order DFS'),
]
for signal, pattern in tree_graph_signals:
print(f'{signal:50s} => {pattern}')Isyarat 7-9: Isyarat Pengaturcaraan Dinamik
Isyarat DP paling sukar dikenal pasti. Cari kata kunci ini:
- 'Bilangan cara untuk...' → DP pengiraan (tambah kiraan submasalah)
- 'Kos minimum/maksimum untuk mencapai...' → DP pengoptimuman (ambil nilai minimum/maksimum submasalah)
- 'Bolehkah kita mencapai...' (kebolehlaksanaan) → DP Boolean (OR bagi submasalah)
- Submasalah ditakrifkan oleh dua indeks rentetan → DP 2D (LCS, jarak suntingan)
- Ambil atau langkau item di bawah kekangan kapasiti → DP beg galas
- Struktur optimum + submasalah bertindih → Periksa pepohon rekursi untuk panggilan berulang → DP
# DP signal recognition
dp_signals = [
('Number of ways to climb stairs / decode string', '1D DP (Fibonacci-like)'),
('Minimum cost to reach end / coin change', '1D DP (greedy fails)'),
('Longest increasing subsequence', '1D DP O(n^2) or patience sort O(n log n)'),
('Longest common subsequence of two strings', '2D DP O(mn)'),
('Edit distance between two strings', '2D DP O(mn) (LCS variant)'),
('Partition array into two equal subsets', '0/1 knapsack boolean DP'),
('Fill knapsack with max value under weight limit', '0/1 knapsack optimisation DP'),
('Burst balloons / matrix chain multiplication', 'Interval DP'),
('Palindrome partitioning minimum cuts', 'Interval DP + prefix palindrome'),
('Rob houses in circle', '1D DP × 2 (linear sub-problems)'),
]
for signal, pattern in dp_signals:
print(f'{signal:55s} => {pattern}')Isyarat 10-12: Isyarat Timbunan, Tindanan dan Tamak
Isyarat bagi masalah timbunan, tindanan monoton dan algoritma tamak:
- K elemen teratas / elemen ke-k terbesar atau terkecil → Timbunan (timbunan minimum untuk K elemen terbesar, timbunan maksimum untuk elemen ke-k terkecil) O(n log k)
- Median aliran → Dua timbunan (timbunan maksimum bagi separuh kecil + timbunan minimum bagi separuh besar)
- Elemen lebih besar/kecil seterusnya → Tindanan monoton O(n)
- Luas segi empat tepat terbesar / perangkap air → Tindanan monoton O(n)
- Penjadualan selang / memaksimumkan selang yang tidak bertindih → Tamak (sort mengikut masa tamat)
# Heap / stack / greedy signals
heap_stack_greedy = [
('Top-K frequent elements', 'Min-heap size K: O(n log k)'),
('Kth largest in array', 'Max-heap pop K times: O(n + k log n)'),
('Streaming median', 'Two heaps (max + min): O(log n) per insert'),
('Merge K sorted lists', 'Min-heap of (val, list_idx): O(n log k)'),
('Next greater element', 'Monotonic decreasing stack: O(n)'),
('Largest rectangle in histogram', 'Monotonic increasing stack: O(n)'),
('Sliding window maximum', 'Monotonic decreasing deque: O(n)'),
('Trapping rain water', 'Two pointers OR monotonic stack: O(n)'),
('Jump game reachability / minimum jumps', 'Greedy range expansion: O(n)'),
('Merge overlapping intervals', 'Sort by start, linear scan: O(n log n)'),
('Gas station circular', 'Greedy: start from reset point: O(n)'),
('Task scheduler with cooldown', 'Greedy: sort by frequency: O(n log n)'),
]
for signal, pattern in heap_stack_greedy:
print(f'{signal:45s} => {pattern}')Isyarat 13-15: Undur Balik dan Manipulasi Bit
Isyarat bagi masalah undur balik dan manipulasi bit:
- Jana semua subhimpunan / pilih atur / kombinasi → Undur balik O(2^n atau n!)
- Pemenuhan kekangan (N-ratu, Sudoku) → Undur balik dengan pemangkasan
- Cari satu elemen yang hilang / unik → XOR O(n), ruang O(1)
- Senaraikan semua subhimpunan bagi himpunan kecil (n ≤ 20) → Penyeneraian topeng bit 2^n
- Mengira bit yang ditetapkan / semakan kuasa dua → Helah bit (n & (n-1))
- DP pemampatan keadaan dengan himpunan kecil → DP topeng bit O(2^n × n)
# Backtracking and bit signals
bt_bit_signals = [
('Generate all subsets of array', 'Backtracking O(n * 2^n) / bitmask'),
('Generate all permutations', 'Backtracking O(n * n!)'),
('Combination sum with target', 'Backtracking with pruning'),
('Word search in grid', 'Backtracking DFS on grid O(m*n*4^L)'),
('N-queens placement', 'Backtracking with column/diag sets'),
('Find single unique element (all others x2)', 'XOR all: O(n) O(1)'),
('Missing number in 0..n', 'XOR or sum formula: O(n) O(1)'),
('Count set bits in n', 'n &= n-1 loop or DP O(n)'),
('Check power of two', 'n > 0 and n & (n-1) == 0'),
('Travelling salesman (n<=20)', 'Bitmask DP O(2^n * n^2)'),
('Number with max XOR in array', 'Trie on binary representation'),
]
for signal, pattern in bt_bit_signals:
print(f'{signal:50s} => {pattern}')Analisis Kekangan: Perkara yang Diberitahu oleh N
Kekangan saiz masukan n secara langsung memberitahu kerumitan masa yang boleh diterima — dan oleh itu keluarga algoritma:
- n ≤ 20: O(2^n) atau O(n!) boleh diterima — DP topeng bit, undur balik
- n ≤ 500: O(n³) boleh diterima — Floyd-Warshall, DP carian menyeluruh
- n ≤ 5000: O(n²) boleh diterima — DP naif, sort kuadratik
- n ≤ 10^6: O(n log n) diperlukan — isihan gabung, timbunan, carian binari
- n ≤ 10^8: O(n) diperlukan — dua penuding, tetingkap gelongsor, DP linear
Analisis kekangan ini harus menjadi langkah pertama anda selepas membaca masalah — sebelum memilih mana-mana algoritma.
# Constraint -> acceptable complexity -> algorithm family
complexity_map = [
('n <= 20', 'O(2^n) or O(n!)', 'Bitmask DP, backtracking/permutations'),
('n <= 500', 'O(n^3)', 'Floyd-Warshall, cubic DP, brute force'),
('n <= 5000', 'O(n^2)', 'Quadratic DP, bubble/insertion sort'),
('n <= 100000', 'O(n log n)', 'Merge sort, heap, binary search, topo sort'),
('n <= 1000000', 'O(n)', 'Linear DP, two pointers, sliding window, hash'),
('n <= 10^8', 'O(n) tight', 'Only simplest O(n) — no large constants'),
('n <= 10^18', 'O(log n) or O(1)', 'Math / number theory, binary search on answer'),
]
print(f'{'Constraint':15s} {'Complexity':15s} {'Algorithm Family'}')
print('-'*70)
for constraint, complexity, algorithms in complexity_map:
print(f'{constraint:15s} {complexity:15s} {algorithms}')Masalah → Corak: Latihan Pantas
Berlatih pemetaan ini sehingga ia berlaku secara automatik. Baca setiap perihalan masalah dan kenal pasti corak sebelum melihat penyelesaian. Kelajuan penting — dalam temu duga anda harus mengenal pasti corak dalam kurang daripada 60 saat:
- 'Diberi tatasusunan yang diisih, tentukan sama ada mana-mana dua elemen berjumlah K'
- 'Diberi pepohon, cari diameter (laluan terpanjang antara mana-mana dua nod)'
- 'Diberi n tugasan dengan tempoh rehat k, cari sela CPU minimum'
- 'Diberi rentetan, cari subrentetan palindrom terpanjang'
- 'Diberi 1..n dengan satu elemen hilang, cari nombor yang hilang'
# Quick-fire pattern recognition answers
problems = [
('Sorted array: two elements sum to K',
'Two pointers (left from start, right from end): O(n)'),
('Tree diameter (longest path)',
'DFS returning (height, max_diameter) pair: O(n)'),
('Task scheduler with cooldown k',
'Greedy: (max_freq - 1)*(k+1) + count_of_max_freq: O(n log n)'),
('Longest palindromic substring',
'Expand around centre OR Manacher: O(n^2) or O(n)'),
('Missing number in 1..n',
'XOR all indices and values: O(n) O(1)'),
('Number of islands in binary grid',
'BFS/DFS flood fill counting connected components: O(m*n)'),
('Decode string like 3[a2[bc]] -> aaabcbcaabcbc',
'Stack to handle nested brackets: O(n)'),
('Valid parentheses [(){[]}]',
'Stack push open, pop+match on close: O(n)'),
]
for problem, solution in problems:
print(f'Q: {problem}\nA: {solution}\n')Tanda Amaran: Apabila Corak Anda Gagal
Walaupun jurutera berpengalaman pada mulanya memilih corak yang salah. Kenal pasti isyarat bahawa pendekatan semasa anda salah dan ubah arah:
- O(n²) anda lulus ujian kecil tetapi melebihi had masa pada masukan besar → memerlukan peta cincang, carian binari atau struktur monoton
- Algoritma tamak anda gagal pada contoh balas → cuba DP
- Ruang keadaan DP anda terlalu besar → cari bukti tamak atau definisi keadaan yang lebih bijak
- BFS anda memberikan jawapan yang salah → semak sama ada anda memerlukan Dijkstra (berwajaran), bukannya BFS (tidak berwajaran)
- Anda berdepan dengan pengecualian penuding nol → tambahkan kes asas dan pengawal kes pinggir sebelum melaksanakan
# Red flags and recovery strategies
red_flags = [
('TLE on large n', 'Check complexity; switch from O(n^2) to O(n log n) or O(n)'),
('WA with greedy', 'Find a counter-example; switch to DP or prove exchange arg'),
('DP table huge', 'State compression (bitmask/rolling array) or different state'),
('BFS gives wrong shortest path', 'Check if edges have weights; use Dijkstra instead'),
('Stack overflow in recursion', 'Add memoisation or convert to iterative with explicit stack'),
('Off-by-one in binary search', 'Use half-open intervals [lo, hi); verify with 2-element test'),
('DSU wrong answer', 'Check 0-indexed vs 1-indexed; check union direction'),
('Backtracking TLE', 'Add pruning conditions; ensure undo step is correct'),
]
print('Pattern | Recovery')
print('-'*70)
for flag, recovery in red_flags:
print(f'{flag:40s} => {recovery}')Menyampaikan Pengecaman Corak dalam Temu Duga
Dalam temu duga, menyampaikan pengecaman corak anda secara lisan menunjukkan kepakaran dan memberi penemu duga peluang untuk membimbing anda jika anda menuju ke arah yang salah. Gunakan struktur skrip ini:
- 'Saya perhatikan tatasusunan ini diisih, jadi saya sedang mempertimbangkan carian binari...'
- 'Masalah ini meminta subtatasusunan maksimum, iaitu masalah algoritma Kadane yang klasik...'
- 'Kita memerlukan semua subhimpunan yang mungkin, yang mencadangkan kaedah undur balik dengan pepohon rekursi...'
- 'Kekangan n ≤ 20 memberitahu saya bahawa 2^n = 1M boleh diterima, jadi DP topeng bit mungkin berfungsi...'
Selepas menyatakan corak, nyatakan kerumitan masa dan ruang sebelum menulis satu baris kod pun. Ini menunjukkan anda memikirkan kecekapan sebelum pelaksanaan.
# Interview communication template
def communicate_approach(problem, pattern, time_complexity, space_complexity, edge_cases):
print(f'Problem: {problem}')
print(f'Pattern: {pattern}')
print(f'Time: {time_complexity}, Space: {space_complexity}')
print(f'Edge cases to handle: {", ".join(edge_cases)}')
print()
# Example communications
communicate_approach(
problem='Find longest substring without repeating characters',
pattern='Sliding window with a set tracking current window characters',
time_complexity='O(n)',
space_complexity='O(min(n, alphabet_size))',
edge_cases=['empty string', 'all same characters', 'all unique characters']
)
communicate_approach(
problem='Given sorted matrix, find if target exists',
pattern='Binary search or staircase search (top-right corner): eliminate row or column each step',
time_complexity='O(m + n)',
space_complexity='O(1)',
edge_cases=['empty matrix', 'single element', 'target at corners']
)Membina Kosa Kata Pengecaman Corak
Cara terpantas membina pengecaman corak adalah dengan menyelesaikan masalah dalam kumpulan bertema — bukan secara rawak. Luangkan seminggu hanya untuk masalah tetingkap gelongsor. Kemudian masalah dua penuding. Selepas itu masalah DP. Menyelesaikan 20 masalah daripada jenis yang sama dengan cepat membina intuisi untuk mengenal pasti corak itu sepintas lalu.
Selepas setiap masalah, tulis 'nota corak' satu baris: isyarat masalah dan corak yang dicetuskannya. Bina helaian rujukan anda sendiri. Selepas menyelesaikan 200 masalah dalam kumpulan bertema, anda akan mengenal pasti kira-kira 90% masalah temu duga dalam kurang daripada 30 saat — baki 10% memerlukan analisis teliti walaupun bagi jurutera berpengalaman.
# Personal pattern note template
pattern_notes = [
{'signal': 'sorted array + two sum', 'pattern': 'two pointers', 'example': 'LC 167 Two Sum II'},
{'signal': 'longest X without repeating', 'pattern': 'sliding window + set', 'example': 'LC 3 Longest Substring'},
{'signal': 'max sum subarray', 'pattern': 'Kadane', 'example': 'LC 53 Max Subarray'},
{'signal': 'permutations/subsets', 'pattern': 'backtracking', 'example': 'LC 46 Permutations'},
{'signal': 'tree path sum', 'pattern': 'DFS with accumulator', 'example': 'LC 112 Path Sum'},
{'signal': 'course schedule', 'pattern': 'Kahn topo sort', 'example': 'LC 207 Course Schedule'},
{'signal': 'top-K elements', 'pattern': 'min-heap size K', 'example': 'LC 215 Kth Largest'},
]
print(f'{'Signal':40s} {'Pattern':30s} {'Example'}')
print('-'*90)
for note in pattern_notes:
print(f'{note["signal"]:40s} {note["pattern"]:30s} {note["example"]}')Semakan Pantas
Uji pemahaman anda tentang konsep Struktur Data & Algoritma — Persediaan Temu Duga Pengekodan daripada pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, anda mempelajari: pengecaman corak memetakan isyarat masalah kepada keluarga algoritma — tatasusunan diisih menandakan carian binari, 'semua subhimpunan' menandakan undur balik, 'kos minimum' menandakan DP, kekangan n memberitahu kerumitan yang boleh diterima: n ≤ 20 membenarkan O(2^n), n ≤ 10^6 memerlukan O(n log n) atau lebih baik, dan menyatakan corak serta kerumitan sebelum menulis kod menunjukkan kepakaran dan membolehkan penemu duga memberikan maklum balas. Seterusnya, kita akan mempraktikkan pengecaman corak dengan masalah temu duga simulasi bermasa pada tahap mudah dan sederhana.
Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 90
- Pelajaran
- 360
Soalan Lazim
Adakah pelajaran “Panduan Ringkas Pengecaman Corak” percuma?
Ya — teks penuh “Panduan Ringkas Pengecaman Corak” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Panduan Ringkas Pengecaman Corak”?
Petakan 15 petunjuk masalah lazim (tatasusunan terisih, perlu semua kombinasi, maksimumkan nilai dengan kekangan dan sebagainya) kepada corak algoritma yang menyelesaikannya paling pantas. Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Panduan Ringkas Pengecaman Corak” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?
Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Panduan Ringkas Pengecaman Corak
- Temu Duga Olok-olok Bermasa: Masalah Mudah dan Sederhana
- Mengendalikan Kes Tepi dan Komunikasi Calon Temu Duga
- Panduan Masalah Sukar: Word Ladder II dan Alien Dictionary