Open In App

Saddleback Search Algorithm in a 2D array

Improve
Improve
Like Article
Like
Save
Share
Report

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 
    1. if they are equal then return its position 
    2. e x then move it to right (if out of bound of the matrix then break return false) 
  3. repeat the 1, 2 and 3 till you find an element or returned false

Thanks to devendraiiit for suggesting below approach.

Implementation: 

C++




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




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


Python3




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




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


Javascript




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


Output

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.



Last Updated : 07 Dec, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads