Skip to main content
ProductsDesktop toolsTASTECADDrawing reviewTASTEFILESFile managementTASTEFTPFile transferTASTESSHRemote workspaceTASTEZIPCompression and extractionDeveloper toolsTASTECODERust integrated development environmentTASTESTUDIOIntegrated development and test environmentTASTEETLData integration (ETL)ServersTASTEREMOTERemote desktop serverTASTEGEOGeospatial serverTASTEMAILMail workspaceGet startedDownloadsDocumentationBuyAll products
Marketplace
News
TechNewsToday's dev newsDeveloper docsProgramming languagesRustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartWeb front-end frameworksNext.jsReactVue.js · NuxtSvelteKitAngularServer frameworksSpring BootDjangoFastAPIASP.NET CoreNestJS · ExpressApp & desktop frameworksTauriFlutterReact NativeElectronAlgorithmsAlgorithm basicsCore algorithmsAdvanced algorithmsPractical algorithms
CommunityProjectsDevelopment logsPromptsAI tool issuesShowcaseCommunity guide
Work with usTech transferWebsite buildDesktop app buildRelease and payment pipelineSales partnerContact
ServicesRemote desktopCustom installer packages
TASTEDEV
Products

Desktop tools

TASTECADComplex drawings, opened with easeTASTEFILESJust the files you need, as fast as possibleTASTEFTPThe tidiest path for your filesTASTESSHA stronger link between you and your serversTASTEZIPPack faster, unpack safer

Developer tools

TASTECODEEdit, build, debug and test Rust apps in one windowTASTESTUDIOFrom editing to remote tests and approved AI fixesTASTEETLMove data while you watch the values

Servers

TASTEREMOTEA remote desktop you run on your own serverTASTEGEORebuilding a GeoServer-compatible geospatial server in RustTASTEMAILTake back control of your email

Get started

DownloadsLatest builds of every productDocsHow to use each productBuySubscriptions and perpetual licencesAll productsEvery product at a glance
All products
MarketplaceNews
Tech

News

Today's dev newsOfficial announcements on languages, frameworks, GitHub and AIDeveloper docsGuides to languages, frameworks and algorithms

Programming languages

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

Frameworks

Web front-end frameworksNext.jsReactVue.js · NuxtSvelteKitAngular
Server frameworksSpring BootDjangoFastAPIASP.NET CoreNestJS · Express
App & desktop frameworksTauriFlutterReact NativeElectron

Algorithms

Algorithm basicsComplexity analysis · Sorting · Searching · Basic data structures · Trees and heapsCore algorithmsGraph traversal · Shortest paths & minimum spanning trees · Dynamic programming · Greedy algorithms · Divide and conquer · BacktrackingAdvanced algorithmsString algorithms · Math and number theory · Bit manipulation · Segment trees · Union-findPractical algorithmsCoding interview strategy · LRU cache · Rate limiting · Consistent hashing
All development docs
Community
ProjectsDiscover builders and their workDevelopment logsDecisions and lessons learnedPromptsReusable instructionsAI tool issuesProblems and workarounds for Claude, Codex, GeminiShowcaseFinished resultsCommunity guideHow we build in the open
Work with us
Tech transferNative apps in Rust and eguiWebsite build10 languages, accounts, docs and downloadsDesktop app buildRust and egui, no WebViewRelease and payment pipelineSigning, MSI, deb, rpm, AppImage, hashesSales partnerRecommend us and earn 30%ContactBuilds, partnerships and investment
Services
Remote desktopReach your computer from a browserCustom installer packagesOnly the features you need, settings preloaded
Buy
EN
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
Log in
Log in
TASTEDEV

From small tools to better development.

support@tastedev.netSupport TASTEDEV
ProductsProduct lineupBuyDocsDownloadsMarketplaceSupport
CommunityProjectsDevelopment logsPromptsAI tool issuesShowcase
PoliciesPrivacy policyTerms of serviceSubscription termsRefund policyCommunity guidelines
AccountLog inSign up
Visitors
Today
012345678901234567890123456789012345678901234567890123456789
Yesterday
012345678901234567890123456789012345678901234567890123456789
Total views
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Company
GXSOFT
Representative
CHOI YOUNG GU
Business registration number
853-44-00368
Address
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
Phone
+82-10-4404-1523
Email
whitecalvin@tastedev.net
Privacy officer
CHOI YOUNG GU

© 2026 TASTEDEVProduct information is based on verified development sources.Released · improving

Coding interview strategy docs
Coding interview strategy
Coding Interview ConceptsA Problem-Solving ProcedureImplementing the PatternsExplaining Complexity and Trade-offsPattern DrillsPreparation and the Test Environment
Discussions

Coding interview strategy guide · 4/6

Explaining Complexity and Trade-offs

In an interview, getting the complexity right is not enough: you have to explain it. "It's O(n)" convinces far less than "n is this, and this operation happens this many times." This chapter covers how to explain complexity out loud, how to infer the target complexity from the input size, and how to discuss trade-offs between solutions.

Saying it out loud, in order

When you state a complexity, cover three things in turn.

  1. Define the variables: say what you are counting, for example "n is the array length and m is the number of queries."
  2. Name the dominant work: point at what happens most often, for example "the outer loop runs n times and each hash map lookup is O(1) on average."
  3. State the space: give the extra memory beyond the input. For recursion, include the depth of the call stack.

For the longest-window-without-repeats solution from the previous chapter, it sounds like this: "n is the length of the string. right moves n times, and left only moves forward, so it moves at most n times as well. Each dictionary lookup and update is O(1) on average, so the time is O(n). The dictionary only holds distinct characters, so the space is O(min(n, σ))."

Inferring the target complexity from the input size

Constraints are a hint about the complexity the problem setter expects. A rough rule of thumb is that a compiled language handles on the order of 10⁸ simple operations per second, and Python handles tens of times fewer. Exact figures depend on the machine, so use only the order of magnitude.

Size of nComplexity that usually passesApproaches to consider
around 10O(n!)permutation backtracking
around 20O(2ⁿ)subsets, bitmasks
around 500O(n³)triple loops, interval DP
around 5,000O(n²)double loops, 2D DP
10⁵ to 10⁶O(n log n), O(n)sorting, heaps, two pointers, hash maps
largerO(log n), O(1)binary search, a formula

One problem, three solutions

Here are three ways to answer "does the array contain two numbers that sum to the target?", followed by a comparison.

def has_pair_brute(nums: list[int], target: int) -> bool:
    # O(n^2) time, O(1) extra space
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            if nums[i] + nums[j] == target:
                return True
    return False


def has_pair_sorted(nums: list[int], target: int) -> bool:
    # O(n log n) time; O(n) for the sorted copy (almost nothing extra if sorted in place)
    arr = sorted(nums)
    lo, hi = 0, len(arr) - 1
    while lo < hi:
        total = arr[lo] + arr[hi]
        if total == target:
            return True
        lo, hi = (lo + 1, hi) if total < target else (lo, hi - 1)
    return False


def has_pair_hash(nums: list[int], target: int) -> bool:
    # O(n) average time, O(n) space
    seen: set[int] = set()
    for x in nums:
        if target - x in seen:
            return True
        seen.add(x)
    return False


for f in (has_pair_brute, has_pair_sorted, has_pair_hash):
    print(f.__name__, f([4, 7, 1, 9], 10), f([4, 7, 1, 9], 2))
SolutionTimeExtra spaceKeeps original indicesChoose it when
Double loopO(n²)O(1)yesn is tiny, or as a reference answer
Sort + two pointersO(n log n)O(1) to O(n)nomemory is tight or the data is already sorted
Hash setO(n) averageO(n)yes (with a map)you need the best average time

If the interviewer asks "can you get the memory down to O(1)?", explain the trade-off of moving from the hash set to sort plus two pointers. To be precise, also mention that hash tables are O(1) on average but can degrade in the worst case because of collisions.

When nested loops are still O(n)

A sliding window has a while inside a for, which looks like O(n²), but the left pointer that the inner loop advances can increase at most n times over the entire run. Adding up the total work across all iterations like this is called amortized analysis. Counting the moves makes it concrete.

def count_moves(nums: list[int], target: int) -> tuple[int, int]:
    left = total = 0
    right_moves = left_moves = 0
    for value in nums:
        right_moves += 1
        total += value
        while total >= target:
            total -= nums[left]
            left += 1
            left_moves += 1
    return right_moves, left_moves


print(count_moves([1] * 1000, 3))  # (1000, 998): at most 2n moves combined

Hidden costs in Python

Even with a correct analysis, misjudging the cost of a language operation produces slow code. These are the usual suspects.

from collections import deque

items = list(range(10))

# list.pop(0) shifts every remaining element: O(n)
queue = deque(items)
first = queue.popleft()          # deque operations at either end are O(1)

# "in" is O(n) on a list but O(1) on average for a set
lookup = set(items)
print(7 in lookup)

# slicing copies: nums[i:j] costs O(j - i)
window_sum = sum(items[2:5])

# repeated string += can be slow; use join instead
text = "".join(str(x) for x in items)
print(first, window_sum, text)

Summary

Explain complexity by defining the variables, naming the dominant work and stating the extra space. Working backwards from the constraints to a target complexity narrows down the right pattern quickly. Most problems have several solutions that trade time for space, so be ready to explain why you chose one and what the alternatives are.

Questions about this chapter?
Previous chapterImplementing the PatternsNext chapterPattern Drills

0 comments

Top commentsNewest first

Sign in · Sign in to leave a comment.