Search in matrix where only individual columns are sorted
Last Updated : 23 Jul, 2025
Given an n * m semi-sorted 2D matrix, mat[][] where each column is individually sorted in ascending order but the rows are not sorted, and a target element x. The task is to find the position (row and column index) of x in the matrix. If the element is not found, return -1.
Examples:
Input: mat[][] = [[1, 4, 7],
[2, 5, 8],
[3, 6, 9]]
x = 5
Output: (1, 1)
Explanation: Element 5 is present in the matrix at row index 1 and column index 1.
Input: mat[][] = [[10, 20, 30],
[15, 25, 35],
[18, 28, 40]]
x = 26
Output: -1
Explanation: Element 26 is not found in any column of the matrix, so the output is -1.
[Naive Approach] - O(n*m) Time and O(1) Space
We linearly scan each element of the matrix and compare it with the target x, moving through every row and column since there is no row-wise order.
For detailed explanation and code please refer Searching Algorithms for 2D Arrays (Matrix).
[Expected Approach] Using Binary Search - O(m*log(n)) Time and O(1) Space
The idea is to leverage the sorted property of each column in the matrix. Since each column is individually sorted, we can apply binary search column-wise to speed up the search which is more efficient than linear search.
C++ // C++ program to search an element in a // column-wise sorted matrix using Binary Search #include <bits/stdc++.h> using namespace std; // Function to perform binary search in a column int binarySearchColumn(vector<vector<int>> &mat, int col, int x) { int low = 0; int high = mat.size() - 1; while (low <= high) { int mid = (low + high) / 2; // Check if mid element is the target if (mat[mid][col] == x) { return mid; } // If mid element is less than x, move down else if (mat[mid][col] < x) { low = mid + 1; } // Else move up else { high = mid - 1; } } // Element not found in this column return -1; } // Function to search x in column-wise sorted matrix vector<int> searchInSemiSortedMatrix( vector<vector<int>> &mat, int x) { int rows = mat.size(); int cols = mat[0].size(); // Apply binary search on each column for (int col = 0; col < cols; col++) { int row = binarySearchColumn(mat, col, x); if (row != -1) { return {row, col}; } } // Element not found in any column return {-1}; } // Driver code int main() { vector<vector<int>> mat = { {1, 4, 7}, {2, 5, 8}, {3, 6, 9} }; int x = 5; vector<int> pos = searchInSemiSortedMatrix(mat, x); if (pos.size() == 2) { cout << "(" << pos[0] << ", " << pos[1] << ")"; } else { cout << "-1"; } return 0; } Java // Java program to search an element in a // column-wise sorted matrix using Binary Search class GfG { // Function to perform binary search in a column static int binarySearchColumn(int[][] mat, int col, int x) { int low = 0; int high = mat.length - 1; while (low <= high) { int mid = (low + high) / 2; // Check if mid element is the target if (mat[mid][col] == x) { return mid; } // If mid element is less than x, move down else if (mat[mid][col] < x) { low = mid + 1; } // Else move up else { high = mid - 1; } } // Element not found in this column return -1; } // Function to search x in column-wise sorted matrix static int[] searchInSemiSortedMatrix(int[][] mat, int x) { int rows = mat.length; int cols = mat[0].length; // Apply binary search on each column for (int col = 0; col < cols; col++) { int row = binarySearchColumn(mat, col, x); if (row != -1) { return new int[]{row, col}; } } // Element not found in any column return new int[]{-1}; } // Driver code public static void main(String[] args) { int[][] mat = { {1, 4, 7}, {2, 5, 8}, {3, 6, 9} }; int x = 5; int[] pos = searchInSemiSortedMatrix(mat, x); if (pos.length == 2) { System.out.print("(" + pos[0] + ", " + pos[1] + ")"); } else { System.out.print("-1"); } } } Python # Python program to search an element in a # column-wise sorted matrix using Binary Search # Function to perform binary search in a column def binarySearchColumn(mat, col, x): low = 0 high = len(mat) - 1 while low <= high: mid = (low + high) // 2 # Check if mid element is the target if mat[mid][col] == x: return mid # If mid element is less than x, move down elif mat[mid][col] < x: low = mid + 1 # Else move up else: high = mid - 1 # Element not found in this column return -1 # Function to search x in column-wise sorted matrix def searchInSemiSortedMatrix(mat, x): rows = len(mat) cols = len(mat[0]) # Apply binary search on each column for col in range(cols): row = binarySearchColumn(mat, col, x) if row != -1: return [row, col] # Element not found in any column return [-1] # Driver code if __name__ == '__main__': mat = [ [1, 4, 7], [2, 5, 8], [3, 6, 9] ] x = 5 pos = searchInSemiSortedMatrix(mat, x) if len(pos) == 2: print(f"({pos[0]}, {pos[1]})") else: print("-1") C# // C# program to search an element in a // column-wise sorted matrix using Binary Search using System; class GfG { // Function to perform binary search in a column static int binarySearchColumn(int[,] mat, int col, int x) { int low = 0; int high = mat.GetLength(0) - 1; while (low <= high) { int mid = (low + high) / 2; // Check if mid element is the target if (mat[mid, col] == x) { return mid; } // If mid element is less than x, move down else if (mat[mid, col] < x) { low = mid + 1; } // Else move up else { high = mid - 1; } } // Element not found in this column return -1; } // Function to search x in column-wise sorted matrix static int[] searchInSemiSortedMatrix(int[,] mat, int x) { int rows = mat.GetLength(0); int cols = mat.GetLength(1); // Apply binary search on each column for (int col = 0; col < cols; col++) { int row = binarySearchColumn(mat, col, x); if (row != -1) { return new int[]{row, col}; } } // Element not found in any column return new int[]{-1}; } // Driver code static void Main() { int[,] mat = { {1, 4, 7}, {2, 5, 8}, {3, 6, 9} }; int x = 5; int[] pos = searchInSemiSortedMatrix(mat, x); if (pos.Length == 2) { Console.Write("(" + pos[0] + ", " + pos[1] + ")"); } else { Console.Write("-1"); } } } JavaScript // JavaScript program to search an element in a // column-wise sorted matrix using Binary Search // Function to perform binary search in a column function binarySearchColumn(mat, col, x) { let low = 0; let high = mat.length - 1; while (low <= high) { let mid = Math.floor((low + high) / 2); // Check if mid element is the target if (mat[mid][col] === x) { return mid; } // If mid element is less than x, move down else if (mat[mid][col] < x) { low = mid + 1; } // Else move up else { high = mid - 1; } } // Element not found in this column return -1; } // Function to search x in column-wise sorted matrix function searchInSemiSortedMatrix(mat, x) { let rows = mat.length; let cols = mat[0].length; // Apply binary search on each column for (let col = 0; col < cols; col++) { let row = binarySearchColumn(mat, col, x); if (row !== -1) { return [row, col]; } } // Element not found in any column return [-1]; } // Driver code let mat = [ [1, 4, 7], [2, 5, 8], [3, 6, 9] ]; let x = 5; let pos = searchInSemiSortedMatrix(mat, x); if (pos.length === 2) { console.log(`(${pos[0]}, ${pos[1]})`); } else { console.log("-1"); }
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem
My Profile