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
Approach: The simple idea is to remove a row or column in each comparison until an element is found. Start searching from the top-right corner of the matrix. There are three possible cases.
The given number is greater than the current number: This will ensure, that all the elements in the current row are smaller than the given number as the pointer is already at the right-most element and the row is sorted. Thus, the entire row gets eliminated and continue the search on the next row. Here elimination means that row needs not to be searched.
The given number is smaller than the current number: This will ensure, that all the elements in the current column are greater than the given number. Thus, the entire column gets eliminated and continue the search on the previous column i.e. the column at the immediate left.
The given number is equal to the current number: This will end the search.
Algorithm:
Let the given element be x, create two variable i = 0, j = n-1 as index of row and column
Run a loop until i = 0
Check if the current element is greater than x then decrease the count of j. Exclude the current column.
Check if the current element is less than x then increase the count of i. Exclude the current row.
If the element is equal then print the position and end.
Thanks to devendraiiit for suggesting the below approach.
Implementation:
C++
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>
usingnamespacestd;
/* 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 */
intsearch(intmat[4][4], intn, intx)
{
if(n == 0)
return-1;
intsmallest = mat[0][0], largest = mat[n - 1][n - 1];
if(x < smallest || x > largest)
return-1;
// set indexes for top right element
inti = 0, j = n - 1;
while(i < n && j >= 0)
{
if(mat[i][j] == x)
{
cout << "n Found at "
<< i << ", "<< j;
return1;
}
if(mat[i][j] > x)
j--;
// Check if mat[i][j] < x
else
i++;
}
cout << "n Element not found";
return0;
}
// Driver code
intmain()
{
intmat[4][4] = { { 10, 20, 30, 40 },
{ 15, 25, 35, 45 },
{ 27, 29, 37, 48 },
{ 32, 33, 39, 50 } };
search(mat, 4, 29);
return0;
}
// This code is contributed
// by Akanksha Rai(Abby_akku)
chevron_right
filter_none
C
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 */
intsearch(intmat[4][4], intn, intx)
{
if(n == 0)
return-1;
intsmallest = mat[0][0], largest = mat[n - 1][n - 1];
if(x < smallest || x > largest)
return-1;
// set indexes for top right element
inti = 0, j = n - 1;
while(i < n && j >= 0)
{
if(mat[i][j] == x)
{
printf("\n Found at %d, %d", i, j);
return1;
}
if(mat[i][j] > x)
j--;
else// if mat[i][j] < x
i++;
}
printf("n Element not found");
return0; // if ( i==n || j== -1 )
}
// driver program to test above function
intmain()
{
intmat[4][4] = {
{ 10, 20, 30, 40 },
{ 15, 25, 35, 45 },
{ 27, 29, 37, 48 },
{ 32, 33, 39, 50 },
};
search(mat, 4, 29);
return0;
}
chevron_right
filter_none
Java
filter_none
edit close
play_arrow
link brightness_4 code
// JAVA Code for Search in a row wise and
// column wise sorted matrix
classGFG {
/* 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 */
privatestaticvoidsearch(int[][] mat,
intn, intx)
{
// set indexes for top right
inti = 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
publicstaticvoidmain(String[] args)
{
intmat[][] = { { 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
Python3
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
defsearch(mat, n, x):
i =0
# set indexes for top right element
j =n -1
while( i < n andj >=0):
if(mat[i][j] ==x ):
print("n Found at ", i, ", ", j)
return1
if(mat[i][j] > x ):
j -=1
# if mat[i][j] < x
else:
i +=1
print("Element not found")
return0# 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
C#
filter_none
edit close
play_arrow
link brightness_4 code
// C# Code for Search in a row wise and
// column wise sorted matrix
usingSystem;
classGFG
{
/* 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 */
privatestaticvoidsearch(int[, ] mat,
intn, intx)
{
// set indexes for top right
// element
inti = 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
publicstaticvoidMain()
{
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
PHP
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 */
functionsearch(&$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;
return1;
}
if($mat[$i][$j] > $x)
$j--;
else// if $mat[$i][$j] < $x
$i++;
}
echo"n Element not found";
return0; // 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
filter_none
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.
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
We use cookies to ensure you have the best browsing experience on our website. By using our site, you
acknowledge that you have read and understood our
Cookie Policy &
Privacy Policy