Skip to content
Related Articles

Related Articles

Improve Article

Saddleback Search Algorithm in a 2D array

  • Difficulty Level : Easy
  • Last Updated : 08 Jul, 2021

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




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

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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :