O(n) represents linear time complexity, where the execution time grows in direct proportion to the input size. O(n^2) indicates quadratic time complexity, where time increases with the square of the input size. You might encounter O(n) in scenarios like iterating through a list once, while O(n^2) is common in algorithms that involve nested loops, such as a naive bubble sort.
In depth
Understanding the difference between O(n) and O(n^2) is crucial for analyzing algorithm efficiency. O(n) implies that as the input size grows, the time taken by the algorithm will increase linearly. For example, if doubling the input size doubles the execution time, the algorithm is O(n). In contrast, O(n^2) means that execution time will grow quadratically; thus, if you double the input size, the execution time increases fourfold. This is common in algorithms that involve comparing every element with every other element, such as in a bubble sort or selection sort. This distinction becomes particularly significant as data sizes grow, where an O(n^2) algorithm may become impractical compared to an O(n) approach in real-world applications, leading to performance bottlenecks.
Example scenario
In a real-world application, consider a scenario where you need to search through a list of user login attempts to check for duplicates. Using a linear search algorithm, which operates in O(n), is efficient as it goes through the list once. However, if you were to implement a naive sorting algorithm, like bubble sort, to sort the list and then check for duplicates, you would be dealing with O(n^2) complexity, which could lead to significant delays as the list size increases, especially during peak login times.
Common mistakes
One common mistake is failing to recognize when an algorithm has quadratic complexity, leading developers to choose it for larger datasets, causing performance issues. Another mistake is overlooking the distinctions between O(n) and O(n^2) in terms of growth rates, resulting in underestimating the impact on the system as input sizes increase. Developers sometimes also confuse average and worst-case complexities, which can lead to misleading performance assessments.
Follow-up questions
- Can you describe a scenario where you had to optimize an O(n^2) algorithm?
- What tools or methods did you use to analyze the performance of your code?
- How would you approach reducing the time complexity of an existing algorithm?
- Can you explain how Big-O notation influences data structure choice?

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.