Find an element in a given matrix such that each row and each column is sorted.
Examples:
Input : arr[] = { { 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} } element=5 Output : Element Found at position (1, 1). Input : arr[]={ { 11, 21, 31, 41, 51 }, { 12, 22, 32, 42, 52 }, { 13, 23, 33, 43, 53 }, { 14, 24, 34, 44, 54 }, { 15, 25, 35, 45, 55 } } element=11 Output : Element Found at position (0, 0).
A simple solution is to search one by one. Time complexity of this solution is O(n2).
A better solution is to use Divide and Conquer to find the element. Time complexity of this solution is O(n1.58). Please refer this article for details.
Below is an efficient solution that works in O(m + n) time.
- Start with the bottom left element
- Loop: compare this element e with x
- if they are equal then return its position
- e x then move it to right (if out of bound of the matrix then break return false)
- repeat the 1, 2 and 3 till you find an element or returned false
Thanks to devendraiiit for suggesting below approach.
Implementation:
// C++ program to search an element in row-wise // and column-wise sorted matrix #include<bits/stdc++.h> using namespace std;
#define MAX 100 /* Searches the element x in mat[m][n]. If the element is found, then prints its position
and returns true, otherwise prints "not found"
and returns false */
bool search( int mat[][MAX], int m, int n, int x)
{ int i = m-1, j = 0; //set indexes for bottom left element
while ( i >= 0 && j < n )
{
if ( mat[i][j] == x )
return true ;
if ( mat[i][j] > x )
i--;
else // if mat[i][j] < x
j++;
}
return false ;
} // driver program to test above function int main()
{ int mat[][MAX] = { {10, 20, 30, 40},
{15, 25, 35, 45},
{27, 29, 37, 48},
{32, 33, 39, 50},
{50, 60, 70, 80},
};
if (search(mat, 5, 4, 29))
cout << "Yes" ;
else
cout << "No" ;
return 0;
} |
// Java program to search an // element in row-wise and // column-wise sorted matrix class GFG
{ static final int MAX = 100 ;
/* Searches the element x in mat[m][n]. If the element is found, then prints its position and returns true, otherwise prints "not found" and returns false */ static boolean search( int mat[][], int m,
int n, int x)
{ // set indexes for
// bottom left element
int i = m - 1 , j = 0 ;
while (i >= 0 && j < n)
{
if (mat[i][j] == x)
return true ;
if (mat[i][j] > x)
i--;
else // if mat[i][j] < x
j++;
}
return false ;
} // Driver Code public static void main(String args[])
{ int mat[][] = {{ 10 , 20 , 30 , 40 },
{ 15 , 25 , 35 , 45 },
{ 27 , 29 , 37 , 48 },
{ 32 , 33 , 39 , 50 },
{ 50 , 60 , 70 , 80 }};
if (search(mat, 5 , 4 , 29 ))
System.out.println( "Yes" );
else System.out.println( "No" );
} } // This code is contributed // by Kirti_Mangal |
# Python program to search an element in # row-wise and column-wise sorted matrix # define MAX 100 # Searches the element x in mat[m][n]. # If the element is found, then prints # its position and returns true, otherwise # prints "not found" and returns false def search(mat, m, n, x):
i, j = m - 1 , 0 # set indexes for bottom
# left element
while (i > = 0 and j < n):
if (mat[i][j] = = x):
return True ;
if (mat[i][j] > x):
i - = 1
else : # if mat[i][j] < x
j + = 1
return False
# Driver Code if __name__ = = '__main__' :
mat = [[ 10 , 20 , 30 , 40 ],
[ 15 , 25 , 35 , 45 ],
[ 27 , 29 , 37 , 48 ],
[ 32 , 33 , 39 , 50 ],
[ 50 , 60 , 70 , 80 ]]
if (search(mat, 5 , 4 , 29 )):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by Rajput-Ji |
// C# program to search an // element in row-wise and // column-wise sorted matrix using System;
class GFG
{ /* Searches the element x in mat[m][n]. If the element is found, then prints its position and returns true, otherwise prints "not found" and returns false */ static bool search( int [,] mat, int m,
int n, int x)
{ // set indexes for
// bottom left element
int i = m - 1, j = 0;
while (i >= 0 && j < n)
{
if (mat[i, j] == x)
return true ;
if (mat[i, j] > x)
i--;
else // if mat[i][j] < x
j++;
}
return false ;
} // Driver Code public static void Main()
{ int [,]mat = {{10, 20, 30, 40},
{15, 25, 35, 45},
{27, 29, 37, 48},
{32, 33, 39, 50},
{50, 60, 70, 80}};
if (search(mat, 5, 4, 29))
Console.WriteLine( "Yes" );
else Console.WriteLine( "No" );
} } // This code is contributed // by Akanksha Rai(Abby_akku) |
<?php // PHP program to search an element in row-wise // and column-wise sorted matrix $MAX = 100;
/* Searches the element x in mat[m][n]. If the element is found, then prints its position and returns true, otherwise prints "not found" and returns false */ function search( $mat , $m , $n , $x )
{ $i = $m - 1;
$j = 0; // set indexes for bottom left element
while ( $i >= 0 && $j < $n )
{
if ( $mat [ $i ][ $j ] == $x )
return true;
if ( $mat [ $i ][ $j ] > $x )
$i --;
else // if mat[i][j] < x
$j ++;
}
return false;
} // Driver Code $mat = array ( array (10, 20, 30, 40),
array (15, 25, 35, 45),
array (27, 29, 37, 48),
array (32, 33, 39, 50),
array (50, 60, 70, 80));
if (search( $mat , 5, 4, 29))
echo "Yes" ;
else echo "No" ;
// This code is contributed by mits ?> |
<script> // JavaScript program to search an // element in row-wise and // column-wise sorted matrix /* Searches the element x in mat[m][n]. If the element is found, then prints its position and returns true, otherwise prints "not found" and returns false */ function search(mat, m, n, x)
{ // set indexes for
// bottom left element
var i = m - 1, j = 0;
while (i >= 0 && j < n)
{
if (mat[i][j] == x)
return true ;
if (mat[i][j] > x)
i--;
else // if mat[i][j] < x
j++;
}
return false ;
} // Driver Code var mat = [[10, 20, 30, 40],
[15, 25, 35, 45],
[27, 29, 37, 48],
[32, 33, 39, 50],
[50, 60, 70, 80]];
if (search(mat, 5, 4, 29))
document.write( "Yes" );
else document.write( "No" );
</script> |
Yes
Time Complexity: O(m + n)
Auxiliary Space: O(1)
The above can also be implemented by starting from the top right corner. Please see search in a row-wise and column wise sorted matrix for the alternate implementation.