Interview kitsBlog

Your dream job? Lets Git IT.
Interactive technical interview preparation platform designed for modern developers.

XGitHub

Platform

  • Categories

Resources

  • Blog
  • About the app
  • FAQ
  • Feedback

Legal

  • Privacy Policy
  • Terms of Service

© 2026 LetsGit.IT. All rights reserved.

LetsGit.IT/Categories/Data Structures
Data Structureshard

Why is append to a dynamic array amortized O(1)?

Tags
#dynamic-array#amortized#resizing#big-o
Back to categoryPractice quiz

Answer

Most appends write into free capacity in O(1). Occasionally the array resizes and copies O(n) elements; spread over many appends, the average cost per append stays O(1) (amortized).

let capacity = 4;
let size = 0;

function append(x: number) {
  if (size === capacity) {
    capacity *= 2; // resize + copy O(n)
  }
  size++;
}

Advanced answer

Deep dive

A dynamic array keeps a backing array with some extra capacity. Most appends just write into the next free slot (O(1)). When the array is full, it allocates a larger array (often 2x), and copies existing elements (O(n)).

Why amortized O(1)? Because resizing is rare. With doubling growth, the total amount of copying across N appends is O(N): each element gets moved a small number of times, so the average cost per append stays constant.

Intuition (doubling)

If capacity doubles, resizes happen at sizes 1, 2, 4, 8, 16... Total copied elements up to N is roughly 1 + 2 + 4 + ... + N = O(N).

Examples

let cap = 4
let size = 0

function append() {
  if (size === cap) {
    cap *= 2 // allocate + copy size elements (O(size))
  }
  size += 1 // write into free slot (O(1))
}

Common pitfalls

  • Amortized does not mean worst-case O(1): a single append can still be O(n).
  • Small growth factors (e.g., +1 each time) cause frequent copies and can become O(n^2).
  • In performance-critical code, repeated appends can trigger GC/allocations; pre-sizing helps (ensureCapacity).

Related questions

Data Structures
What is a segment tree and what complexity does it give for range queries and updates?
#segment-tree#range-query#updates
Data Structures
Building a heap from an array: why can it be O(n), not O(n log n)?
#heap#heapify#complexity
Data Structures
Why can a hash table resize cause latency spikes, and how can you mitigate it?
#hash-table#rehash#latency
Data Structures
What is a sparse table and what problems is it good for?
#sparse-table#rmq#preprocessing
Data Structures
What is a segment tree and what is it good for?
#segment-tree#range-query#big-o
Data Structures
What is the heap property in a binary heap?
#heap#binary-heap#priority-queue