Search in 2D Matrix in DSA C - Time & Space Complexity
We want to understand how long it takes to find a number in a 2D matrix.
How does the search time grow when the matrix gets bigger?
Analyze the time complexity of the following code snippet.
int searchMatrix(int** matrix, int rows, int cols, int target) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (matrix[i][j] == target) {
return 1; // found
}
}
}
return 0; // not found
}
This code checks each element in the matrix one by one to find the target number.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Checking each element in the matrix.
- How many times: The inner loop runs for each column, and the outer loop runs for each row, so total checks = rows x cols.
As the matrix size grows, the number of checks grows with the total elements.
| Input Size (rows x cols) | Approx. Operations |
|---|---|
| 10 (e.g., 2x5) | About 10 checks |
| 100 (e.g., 10x10) | About 100 checks |
| 1000 (e.g., 25x40) | About 1000 checks |
Pattern observation: The operations grow directly with the number of elements; doubling elements doubles the work.
Time Complexity: O(rows * cols)
This means the time to search grows proportionally with the total number of elements in the matrix.
[X] Wrong: "Since the matrix is sorted, we can find the target in constant time."
[OK] Correct: Even if sorted, this simple search checks every element until it finds the target, so it still takes time proportional to the matrix size.
Understanding how search time grows helps you explain and improve your code in real projects.
"What if we used binary search on each row instead of checking every element? How would the time complexity change?"
Practice
Solution
Step 1: Understand matrix sorting property
Each row is sorted and the first element of a row is greater than the last element of the previous row, so the entire matrix can be seen as a sorted list.Step 2: Apply binary search on the matrix
By treating the matrix as a single sorted array, binary search can be used efficiently to find the target.Final Answer:
Treat the 2D matrix as a sorted 1D array and apply binary search -> Option DQuick Check:
Matrix sorted row-wise = binary search [OK]
- Searching each row linearly wastes time
- Using hash map wastes extra space
- Starting from bottom-left only works if columns are sorted
Solution
Step 1: Calculate mid index in 1D
mid = (low + high) / 2 correctly finds the middle index between low and high.Step 2: Convert mid to 2D indices
Row is mid divided by number of columns (mid / cols), column is mid modulo number of columns (mid % cols).Final Answer:
int mid = (low + high) / 2; int row = mid / cols; int col = mid % cols; -> Option BQuick Check:
Row = mid/cols, Col = mid%cols [OK]
- Swapping rows and columns in calculation
- Using rows instead of cols for division/modulo
- Using bit shift incorrectly for mid
int matrix[3][4] = {
{1, 3, 5, 7},
{10, 11, 16, 20},
{23, 30, 34, 60}
};
int target = 5;
int rows = 3, cols = 4;
int low = 0, high = rows * cols - 1;
int found = 0;
while (low <= high) {
int mid = (low + high) / 2;
int r = mid / cols;
int c = mid % cols;
if (matrix[r][c] == target) {
found = 1;
break;
} else if (matrix[r][c] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
printf("%d\n", found);Solution
Step 1: Perform binary search on matrix
The code treats the matrix as a sorted 1D array and searches for target 5 using binary search.Step 2: Check if target 5 exists
5 is present at matrix[0][2], so found will be set to 1 and loop breaks.Final Answer:
1 -> Option AQuick Check:
Target found = 1 [OK]
- Confusing indices calculation for row and column
- Not updating low and high correctly
- Printing target value instead of found flag
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
int target = 4;
int rows = 2, cols = 3;
int low = 0, high = rows * cols - 1;
int found = 0;
while (low < high) {
int mid = (low + high) / 2;
int r = mid / cols;
int c = mid % cols;
if (matrix[r][c] == target) {
found = 1;
break;
} else if (matrix[r][c] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
printf("%d\n", found);Solution
Step 1: Analyze loop condition
The loop uses while (low < high), which misses the case when low == high, possibly skipping the last element.Step 2: Fix loop condition
Changing to while (low <= high) ensures all elements are checked, including when low equals high.Final Answer:
Change while condition to low <= high -> Option CQuick Check:
Loop must check low == high [OK]
- Using < instead of <= in loop condition
- Incorrect mid calculation causing infinite loop
- Swapping row and column indices
Solution
Step 1: Understand matrix property
Rows are sorted but no guarantee about relation between rows, so matrix is not fully sorted as 1D array.Step 2: Choose search method
Starting from top-right corner, move left if current > target, move down if current < target, efficiently narrows search.Final Answer:
Start from top-right corner and move left or down -> Option AQuick Check:
Partial row sorting = stair-step search [OK]
- Applying full binary search on unsorted matrix
- Searching each row linearly wasting time
- Using hash map wasting extra space
Ready to prove it?
Pass the test and this pattern moves unknown
