Saddleback Search Algorithm in a 2D array

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.
1) Start with the bottom left element
2) Loop: compare this element e with x
….i) if they are equal then return its position
…ii) e x then move it to right (if out of bound of the matrix then break return false)
3) repeat the i), ii) and iii) till you find an element or returned false

Thanks to devendraiiit for suggesting 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>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


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
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)

chevron_right


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
  
$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
?>

chevron_right


Output:

Yes

Time Complexity: O(m + n)

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.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.





Article Tags :
Practice Tags :


1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.