在给定的矩阵中找到一个元素,以便对每一行和每一列进行排序。
例子:
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).
一个简单的解决方案是一个一个地搜索。该解决方案的时间复杂度为O(n 2 )。
更好的解决方案是使用分而治之来查找元素。该解决方案的时间复杂度为O(n 1.58 )。请参阅本文以获取详细信息。
以下是在O(m + n)时间内有效的解决方案。
1)从左下角元素开始
2)循环:将此元素e与x进行比较
….i)如果相等,则返回其位置
…ii)ex然后将其向右移动(如果超出矩阵范围,则返回false)
3)重复i),ii)和iii),直到找到一个元素或返回false
感谢devendraiiit建议以下方法。
执行:
C++
// C++ program to search an element in row-wise
// and column-wise sorted matrix
#include
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
= 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
?>
输出:
Yes
时间复杂度: O(m + n)
以上也可以通过从右上角开始来实现。请参阅按行和列排序的矩阵中的搜索以了解替代实现。