Search in a row wise and column wise sorted matrix

Given an n x n matrix and a number x, find the position of x in the matrix if it is present in it. Otherwise, print “Not Found”. In the given matrix, every row and column is sorted in increasing order. The designed algorithm should have linear time complexity. 
Example: 

Input: mat[4][4] = { {10, 20, 30, 40},
                      {15, 25, 35, 45},
                      {27, 29, 37, 48},
                      {32, 33, 39, 50}};
              x = 29
Output: Found at (2, 1)
Explanation: Element at (2,1) is 29

Input : mat[4][4] = { {10, 20, 30, 40},
                      {15, 25, 35, 45},
                      {27, 29, 37, 48},
                      {32, 33, 39, 50}};
              x = 100
Output : Element not found
Explanation: Element 100 is not found

Simple Solution  

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to search an element in row-wise
// and column-wise sorted matrix
#include <bits/stdc++.h>
   
using namespace std;
   
/* Searches the element x in mat[][]. If the 
element is found, then prints its position 
and returns true, otherwise prints "not found"
and returns false */
int search(int mat[4][4], int n, int x)
{
    if (n == 0)
        return -1;
      
    //traverse through the matrix
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        //if the element is found
        if(mat[i][j] == x)
        {
            cout<<"Element found at ("<<
                        i << ", " << j << ")\n";
            return 1;
        }
    }
   
    cout << "n Element not found";
    return 0; 
}
   
// Driver code
int main()
{
    int mat[4][4] = { { 10, 20, 30, 40 },
                      { 15, 25, 35, 45 },
                      { 27, 29, 37, 48 },
                      { 32, 33, 39, 50 } };
    search(mat, 4, 29);
   
    return 0;
}
chevron_right

Output
Element found at (2, 1)

A better solution is to use Divide and Conquer to find the element which has a time complexity of O(n1.58). Please refer here for details.
Efficient Solution 

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to search an element in row-wise
// and column-wise sorted matrix
#include <bits/stdc++.h>
  
using namespace std;
  
/* Searches the element x in mat[][]. If the 
element is found, then prints its position 
and returns true, otherwise prints "not found"
and returns false */
int search(int mat[4][4], int n, int x)
{
    if (n == 0)
        return -1;
    
    int smallest = mat[0][0], largest = mat[n - 1][n - 1];
    if (x < smallest || x > largest)
        return -1;
    
    // set indexes for top right element
    int i = 0, j = n - 1; 
    while (i < n && j >= 0) 
    {
        if (mat[i][j] == x) 
        {
            cout << "n Found at "
                 << i << ", " << j;
            return 1;
        }
        if (mat[i][j] > x)
            j--;
        
        // Check if mat[i][j] < x
        else 
            i++;
    }
  
    cout << "n Element not found";
    return 0;
}
  
// Driver code
int main()
{
    int mat[4][4] = { { 10, 20, 30, 40 },
                      { 15, 25, 35, 45 },
                      { 27, 29, 37, 48 },
                      { 32, 33, 39, 50 } };
    search(mat, 4, 29);
  
    return 0;
}
  
// This code is contributed
// by Akanksha Rai(Abby_akku)
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C program to search an element in row-wise
// and column-wise sorted matrix
#include <stdio.h>
  
/* Searches the element x in mat[][]. If the 
element is found, then prints its position 
and returns true, otherwise prints "not found"
and returns false */
int search(int mat[4][4], int n, int x)
{
    if (n == 0)
        return -1;
    int smallest = mat[0][0], largest = mat[n - 1][n - 1];
    if (x < smallest || x > largest)
        return -1;
    
    // set indexes for top right element
    int i = 0, j = n - 1; 
    while (i < n && j >= 0) 
    {
        if (mat[i][j] == x) 
        {
            printf("\n Found at %d, %d", i, j);
            return 1;
        }
        if (mat[i][j] > x)
            j--;
        else // if mat[i][j] < x
            i++;
    }
  
    printf("n Element not found");
    return 0; // if ( i==n || j== -1 )
}
  
// driver program to test above function
int main()
{
    int mat[4][4] = {
        { 10, 20, 30, 40 },
        { 15, 25, 35, 45 },
        { 27, 29, 37, 48 },
        { 32, 33, 39, 50 },
    };
    search(mat, 4, 29);
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// JAVA Code for Search in a row wise and
// column wise sorted matrix
  
class GFG {
  
    /* Searches the element x in mat[][]. If the 
    element is found, then prints its position 
    and returns true, otherwise prints "not found"
    and returns false */
    private static void search(int[][] mat, 
                                    int n, int x)
    {
          
        // set indexes for top right
        int i = 0, j = n - 1
        // element
  
        while (i < n && j >= 0
        {
            if (mat[i][j] == x) 
            {
                System.out.print("n Found at "
                                    i + " " + j);
                return;
            }
            if (mat[i][j] > x)
                j--;
            else // if mat[i][j] < x
                i++;
        }
  
        System.out.print("n Element not found");
        return; // if ( i==n || j== -1 )
    }
    // driver program to test above function
    public static void main(String[] args)
    {
        int mat[][] = { { 10, 20, 30, 40 },
                        { 15, 25, 35, 45 },
                        { 27, 29, 37, 48 },
                        { 32, 33, 39, 50 } };
  
        search(mat, 4, 29);
    }
}
// This code is contributed by Arnav Kr. Mandal.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to search an element 
# in row-wise and column-wise sorted matrix
  
# Searches the element x in mat[][]. If the 
# element is found, then prints its position 
# and returns true, otherwise prints "not found"
# and returns false
def search(mat, n, x):
  
    i = 0
      
    # set indexes for top right element
    j = n - 1
    while ( i < n and j >= 0 ):
      
        if (mat[i][j] == x ):
      
            print("n Found at ", i, ", ", j)
            return 1
      
        if (mat[i][j] > x ):
            j -= 1
              
        # if mat[i][j] < x
        else
            i += 1
      
    print("Element not found")
    return 0 # if (i == n || j == -1 )
  
# Driver Code
mat = [ [10, 20, 30, 40],
        [15, 25, 35, 45],
        [27, 29, 37, 48],
        [32, 33, 39, 50] ]
search(mat, 4, 29)
  
# This code is contributed by Anant Agarwal.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Code for Search in a row wise and
// column wise sorted matrix
using System;
  
class GFG 
{
    /* Searches the element x in mat[][]. If the 
    element is found, then prints its position 
    and returns true, otherwise prints "not found"
    and returns false */
    private static void search(int[, ] mat,
                               int n, int x)
    {
        // set indexes for top right
        // element
        int i = 0, j = n - 1;
  
        while (i < n && j >= 0) 
        {
            if (mat[i, j] == x) 
            {
                Console.Write("n Found at "
                              + i + ", " + j);
                return;
            }
  
            if (mat[i, j] > x)
                j--;
            else // if mat[i][j] < x
                i++;
        }
  
        Console.Write("n Element not found");
        return; // if ( i==n || j== -1 )
    }
    // driver program to test above function
    public static void Main()
    {
  
        int[, ] mat = { { 10, 20, 30, 40 },
                        { 15, 25, 35, 45 },
                        { 27, 29, 37, 48 },
                        { 32, 33, 39, 50 } };
  
        search(mat, 4, 29);
    }
}
  
// This code is contributed by Sam007
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php 
// PHP program to search an 
// element in row-wise and 
// column-wise sorted matrix
  
/* Searches the element $x 
in mat[][]. If the element is 
found, then prints its position 
and returns true, otherwise prints
"not found" and returns false */
function search(&$mat, $n, $x)
{
    $i = 0;
    $j = $n - 1; // set indexes for
                // top right element
    while ($i < $n && $j >= 0)
    {
        if ($mat[$i][$j] == $x)
        {
            echo "n found at " . $i
                        ", " . $j;
            return 1;
        }
        if ($mat[$i][$j] > $x)
            $j--;
        else // if $mat[$i][$j] < $x
            $i++;
    }
      
    echo "n Element not found";
    return 0; // if ( $i==$n || $j== -1 )
}
  
// Driver Code
$mat = array(array(10, 20, 30, 40),
            array(15, 25, 35, 45),
            array(27, 29, 37, 48),
            array(32, 33, 39, 50));
search($mat, 4, 29);
  
// This code is contributed
// by ChitraNayal
?>
chevron_right

Output

n Found at 2, 1

Time Complexity: O(n). 
Only one traversal is needed, i.e, i from 0 to n and j from n-1 to 0 with at most 2*n steps. 
The above approach will also work for m x n matrix (not only for n x n). Complexity would be O(m + n). 
Space Complexity: O(1). 
No extra space is required.

Related Article : 
Search element in a sorted matrix
Please write comments if you find the above codes/algorithms incorrect, or find other ways to solve the same problem.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.





Article Tags :