O(n) describes linear time complexity, meaning the time taken grows linearly with the input size, while O(n^2) describes quadratic time complexity, where time grows proportionally to the square of the input size. An example of O(n) is a simple loop through an array, and an example of O(n^2) is a nested loop that iterates through the same array.
In depth
The difference between O(n) and O(n^2) lies in how the execution time scales with the input size. With O(n), as input size increases, the number of operations increases linearly; for instance, one iteration for each element in a single loop. In contrast, O(n^2) signifies that for each element of the input, you have to perform an operation for every other element, leading to a quadratic growth pattern. This typically happens in algorithms that require comparing each element to every other element, such as selection sort or bubble sort. These algorithms can become impractical for larger datasets, as the time required can balloon quickly. It's crucial to understand these complexities to make informed decisions about algorithm choice based on expected input sizes and performance requirements. The performance impact can be significant, especially in real-time applications.
Example scenario
Consider a scenario where a web application needs to search through user-generated content to find duplicates. If you use a linear search approach where each user entry is checked against a list of existing entries, this will have O(n) time complexity. However, if you implement a method where you compare every entry against every other entry in a nested loop to identify duplicates, you have introduced O(n^2) time complexity. This quadratic approach may work for a handful of entries, but as the user base scales, performance will degrade dramatically, leading to slow responses and a poor user experience.
Common mistakes
One common mistake is assuming that O(n^2) algorithms can handle larger datasets without considering performance degradation. Developers may opt for simpler algorithms like bubble sort for its ease of understanding, overlooking the significant time cost in larger datasets. Another mistake is failing to analyze the implications of nested loops. Developers might write a double nested loop without realizing that their solution could be made more efficient with proper data structures, like using hashmaps or sets to reduce time complexity to O(n).
Follow-up questions
- Can you discuss how you might optimize an O(n^2) algorithm?
- What factors would you consider when choosing an algorithm for a particular problem?
- Can you give another example of O(log n) time complexity?
- How does space complexity relate to time complexity?

Preparing for a system design interview?
- A 7-step method for answering any system design question, plus estimation numbers
- 5 worked designs: URL shortener, rate limiter, chat, news feed and file storage
- Guides to caching, databases, queues, consistency and reliability, with a 4-week study plan
- 306 practice questions with answers on caching, databases, queues, microservices, APIs and more
5 worked designs, a 4-week plan and 306 practice questions with answers.
The material stays free to read online. This is the organised, offline, print-ready PDF edition. Secure payment by PayPal; your personal download link is emailed after payment is confirmed. Digital product, no shipping.