Fuskblad för mönsterigenkänning
Koppla 15 vanliga problemsignaler (sorterad array, behov av alla kombinationer, maximera värde under en begränsning med mera) till de algoritmmönster som löser dem snabbast.
Fuskblad för mönsterigenkänning är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Mönsterigenkänning på 60 sekunder
I en riktig intervju har du ungefär 60 sekunder efter att du har läst ett problem på dig att identifiera vilket algoritmiskt mönster som är tillämpligt innan intervjuaren förväntar sig att du börjar koda. Det här är den viktigaste färdigheten att utveckla – inte att memorera implementationer, utan att känna igen vilket verktyg du ska använda.
Mönsterigenkänning bygger på att koppla problemsignaler (ord och begränsningar i problemformuleringen) till kända algoritmfamiljer. När du har identifierat mönstret blir implementationen en övning i att fylla i en mall. Den här lektionen är en systematisk fusklapp över de 15 vanligaste problemsignalerna och deras motsvarande mönster.
# 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)Signal 1–3: Mönster för arrayer och strängar
De vanligaste problemsignalerna för arrayer och strängar:
- Sorterad array + hitta mål → Binärsökning O(log n)
- Hitta ett par/en trippel vars summa är målet → Two pointers O(n) om arrayen är sorterad, hash map O(n) om den är osorterad
- Längsta/kortaste delarrayen eller delsträngen som uppfyller ett villkor → Sliding window O(n)
- Största/minsta summa för en sammanhängande delarray → Kadane's algorithm O(n)
- Upptäckt av dubbletter → Hash set O(n) eller sortering O(n log n)
Om arrayen är sorterad bör du alltid överväga binärsökning först. Osorterad array + målsumma + O(n) = nästan alltid en hash map för att slå upp komplementet.
# 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}')Signal 4–6: Träd- och grafmönster
Problemsignaler för träd och grafer och deras mönster:
- Nivåvis traversering / kortaste väg i en oviktad graf → BFS med deque O(V+E)
- Utforska alla vägar / upptäck cykler / DFS-ordning → rekursiv eller iterativ DFS O(V+E)
- BST + in-order-egenskaper (k:te elementet, sorterad ordning) → in-order-DFS O(n)
- Närmaste gemensamma förfader → rekursiv nedstigning med spårning av vägen O(n)
- Sammanhängande komponenter / förena två grupper → DSU O(n × alpha(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}')Signal 7–9: Signaler för dynamisk programmering
DP-signaler är svårast att känna igen. Leta efter följande nyckelord:
- 'Hur många sätt finns det att ...?' → Räknings-DP (addera antalen för delproblem)
- 'Minsta/största kostnad för att uppnå ...' → Optimerings-DP (ta min/max av delproblemen)
- 'Kan vi uppnå ...?' (genomförbarhet) → Boolesk DP (OR av delproblemen)
- Delproblem som definieras av två strängindex → 2D-DP (LCS, edit distance)
- Välj eller hoppa över objekt under en kapacitetsbegränsning → Knapsack-DP
- Optimal delstruktur + överlappande delproblem → Kontrollera rekursionsträdet efter upprepade anrop → 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}')Signal 10–12: Signaler för heapar, stackar och greedy-algoritmer
Signaler för problem med heapar, monotona stackar och greedy-algoritmer:
- Top-K-element / k:te största eller minsta → Heap (min-heap för de K största, max-heap för det k:te minsta) O(n log k)
- Median i en dataström → Två heapar (max-heap för den mindre halvan + min-heap för den större halvan)
- Nästa större/mindre element → Monoton stack O(n)
- Rektangel med störst area / vatten som fångas → Monoton stack O(n)
- Intervallplanering / maximera icke-överlappande intervall → Greedy (sortera efter sluttid)
# 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}')Signal 13–15: Backtracking och bitmanipulering
Signaler för backtracking och bitmanipulering:
- Generera alla delmängder / permutationer / kombinationer → Backtracking O(2^n eller n!)
- Problem med begränsningar (N-drottningar, Sudoku) → Backtracking med beskärning
- Hitta ett saknat/unikt element → XOR O(n) O(1)-utrymme
- Enumerera alla delmängder i en liten mängd (n ≤ 20) → Bitmaskenumerering 2^n
- Räkna ett-bitar / kontrollera om ett tal är en tvåpotens → Bittrick (n & (n-1))
- DP med tillståndskomprimering för en liten mängd → Bitmask-DP 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}')Begränsningsanalys: vad N berättar för dig
Begränsningen för indatastorleken n visar direkt vilken tidskomplexitet som är acceptabel – och därmed vilken algoritmfamilj:
- n ≤ 20: O(2^n) eller O(n!) är acceptabelt — bitmask-DP, backtracking
- n ≤ 500: O(n³) är acceptabelt — Floyd-Warshall, brute-force-DP
- n ≤ 5000: O(n²) är acceptabelt — naiv DP, kvadratisk sortering
- n ≤ 10^6: O(n log n) krävs — merge sort, heap, binärsökning
- n ≤ 10^8: O(n) krävs — two pointers, sliding window, linjär DP
Den här begränsningsanalysen bör vara ditt första steg efter att du har läst problemet – innan du väljer algoritm.
# 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}')Problem → mönster: Snabbträning
Öva på den här kopplingen tills den blir automatisk. Läs varje problembeskrivning och identifiera mönstret innan du tittar på lösningen. Snabbhet är viktigt – under en intervju bör du identifiera mönstret på under 60 sekunder:
- 'Givet en sorterad array, kontrollera om två element har summan K'
- 'Givet ett träd, hitta diametern (den längsta vägen mellan två valfria noder)'
- 'Givet n uppgifter med cooldown k, hitta det minsta antalet CPU-intervall'
- 'Givet en sträng, hitta den längsta palindromiska delsträngen'
- 'Givet 1..n där ett tal saknas, hitta det saknade talet'
# 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')Varningssignaler: när ditt mönster inte fungerar
Även erfarna utvecklare väljer först fel mönster. Känn igen följande signaler på att din nuvarande metod är fel och byt strategi:
- Din O(n²)-lösning klarar små tester men ger TLE på stora indata → du behöver en hash map, binärsökning eller en monoton struktur
- Din greedy-lösning misslyckas på ett motexempel → prova DP
- Ditt DP-tillståndsrum är för stort → leta efter ett greedy-bevis eller en smartare tillståndsdefinition
- Din BFS ger fel svar → kontrollera om du behöver Dijkstra (viktad) i stället för BFS (oviktad)
- Du får null pointer exceptions → lägg till basfall och skydd för kantfall innan du implementerar
# 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}')Så kommunicerar du mönsterigenkänning under intervjuer
Under intervjuer visar du expertis genom att uttala din mönsterigenkänning högt, samtidigt som intervjuaren får möjlighet att vägleda dig om du är på fel spår. Använd den här strukturen:
- 'Jag ser att arrayen är sorterad, så jag tänker på binärsökning ...'
- 'Problemet frågar efter den största delarrayen, vilket är ett klassiskt problem för Kadane's algorithm ...'
- 'Vi behöver alla möjliga delmängder, vilket antyder backtracking med ett rekursionsträd ...'
- 'Begränsningen n ≤ 20 säger mig att 2^n = 1M är acceptabelt, så bitmask-DP kan fungera ...'
När du har angett mönstret ska du nämna tids- och minneskomplexiteten innan du skriver en enda kodrad. Det visar att du tänker på effektiviteten innan implementationen.
# 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']
)Bygg upp ditt ordförråd för mönsterigenkänning
Det snabbaste sättet att bygga upp mönsterigenkänning är att lösa problem i tematiska grupper – inte slumpmässigt. Ägna en vecka enbart åt problem med sliding window. Gå sedan vidare till problem med two pointers. Därefter problem med DP. Genom att snabbt lösa 20 problem av samma typ bygger du upp intuitionen för att känna igen mönstret vid första anblicken.
Efter varje problem skriver du en kort 'mönsteranteckning': problemsignalen och mönstret den utlöste. Bygg din egen fusklapp. När du har löst 200 problem i tematiska grupper kommer du att känna igen ungefär 90 % av intervjuproblemen på under 30 sekunder – de återstående 10 % kräver noggrann analys även av erfarna utvecklare.
# 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"]}')Snabbkontroll
Testa din förståelse av begreppen i Data Structures & Algorithms — Coding Interview Prep från den här lektionen.
Sammanfattning av lektionen
I den här lektionen lärde du dig: mönsterigenkänning kopplar problemsignaler till algoritmfamiljer – en sorterad array antyder binärsökning, 'alla delmängder' antyder backtracking och 'minsta kostnad' antyder DP, begränsningen n visar vilken komplexitet som är acceptabel: n ≤ 20 tillåter O(2^n), medan n ≤ 10^6 kräver O(n log n) eller bättre, och att uttala mönstret och komplexiteten innan du kodar visar expertis och gör det möjligt för intervjuaren att ge återkoppling. Härnäst omsätter vi mönsterigenkänning i praktiken med tidsbegränsade simulerade intervjuproblem på enkel och medelsvår nivå.
Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 90
- Lektioner
- 360
Vanliga frågor
Är lektionen ”Fuskblad för mönsterigenkänning” gratis?
Ja – hela texten till ”Fuskblad för mönsterigenkänning” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Vad lär jag mig i ”Fuskblad för mönsterigenkänning”?
Koppla 15 vanliga problemsignaler (sorterad array, behov av alla kombinationer, maximera värde under en begränsning med mera) till de algoritmmönster som löser dem snabbast. Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?
Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Fuskblad för mönsterigenkänning”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?
Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Fuskblad för mönsterigenkänning
- Tidsbegränsad övningsintervju: enkla och medelsvåra problem
- Hantering av specialfall och kommunikation under intervjun
- Genomgång av svåra problem: Word Ladder II och Alien Dictionary