Find all matrix elements which are minimum in their row and maximum in their column
Last Updated :
28 Dec, 2022
Given a matrix mat[][] of size M * N, the task is to find all matrix elements which are minimum in their respective row and maximum in their respective column. If no such element is present, print -1.
Examples:
Input: mat[][] = {{1, 10, 4}, {9, 3, 8}, {15, 16, 17}}
Output: 15
Explanation:
15 is the only element which is maximum in its column {1, 9, 15} and minimum in its row {15, 16, 17}.
Input: m[][] = {{10, 41}, {3, 5}, {16, 2}}
Output: -1
Approach: Follow the steps below to solve the problem:
- Create an unordered_set and store the minimum element of each row of the matrix.
- Traverse the matrix and find the maximum element of each column. For every column, check if the maximum obtained is already present in the unordered_set or not.
- If found to be true, print that number. If no such matrix element is found, print -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > minmaxNumbers(vector<vector< int > >& matrix,
vector< int >& res)
{
unordered_set< int > set;
for ( int i = 0; i < matrix.size(); i++) {
int minr = INT_MAX;
for ( int j = 0; j < matrix[i].size(); j++) {
minr = min(minr, matrix[i][j]);
}
set.insert(minr);
}
for ( int j = 0; j < matrix[0].size(); j++) {
int maxc = INT_MIN;
for ( int i = 0; i < matrix.size(); i++) {
maxc = max(maxc, matrix[i][j]);
}
if (set.find(maxc) != set.end()) {
res.push_back(maxc);
}
}
return res;
}
int main()
{
vector<vector< int > > mat
= { { 1, 10, 4 },
{ 9, 3, 8 },
{ 15, 16, 17 } };
vector< int > ans;
minmaxNumbers(mat, ans);
if (ans.size() == 0)
cout << "-1" << endl;
for ( int i = 0; i < ans.size(); i++)
cout << ans[i] << endl;
return 0;
}
|
Java
import java.util.*;
class GFG{
public static Vector<Integer>minmaxNumbers( int [][] matrix,
Vector<Integer> res)
{
Set<Integer> set = new HashSet<Integer>();
for ( int i = 0 ; i < matrix.length; i++)
{
int minr = Integer.MAX_VALUE;
for ( int j = 0 ; j < matrix[i].length; j++)
{
minr = Math.min(minr, matrix[i][j]);
}
set.add(minr);
}
for ( int j = 0 ; j < matrix[ 0 ].length; j++)
{
int maxc = Integer.MIN_VALUE;
for ( int i = 0 ; i < matrix.length; i++)
{
maxc = Math.max(maxc, matrix[i][j]);
}
if (set.contains(maxc))
{
res.add(maxc);
}
}
return res;
}
public static void main(String[] args)
{
int [][] mat = { { 1 , 10 , 4 },
{ 9 , 3 , 8 },
{ 15 , 16 , 17 } };
Vector<Integer> ans = new Vector<Integer>();
ans = minmaxNumbers(mat, ans);
if (ans.size() == 0 )
System.out.println( "-1" );
for ( int i = 0 ; i < ans.size(); i++)
System.out.println(ans.get(i));
}
}
|
Python3
import sys
def minmaxNumbers(matrix, res):
s = set ()
for i in range ( 0 , len (matrix), 1 ):
minr = sys.maxsize
for j in range ( 0 , len (matrix[i]), 1 ):
minr = min (minr, matrix[i][j])
s.add(minr)
for j in range ( 0 , len (matrix[ 0 ]), 1 ):
maxc = - sys.maxsize - 1
for i in range ( 0 , len (matrix), 1 ):
maxc = max (maxc, matrix[i][j])
if (maxc in s):
res.append(maxc)
return res
if __name__ = = '__main__' :
mat = [ [ 1 , 10 , 4 ],
[ 9 , 3 , 8 ],
[ 15 , 16 , 17 ] ]
ans = []
minmaxNumbers(mat, ans)
if ( len (ans) = = 0 ):
print ( "-1" )
for i in range ( len (ans)):
print (ans[i])
|
C#
using System;
using System.Collections.Generic;
class GFG{
public static List< int > minmaxNumbers( int [,] matrix,
List< int > res)
{
HashSet< int > set = new HashSet< int >();
for ( int i = 0; i < matrix.GetLength(0); i++)
{
int minr = int .MaxValue;
for ( int j = 0; j < matrix.GetLength(1); j++)
{
minr = Math.Min(minr, matrix[i, j]);
}
set .Add(minr);
}
for ( int j = 0; j < matrix.GetLength(0); j++)
{
int maxc = int .MinValue;
for ( int i = 0; i < matrix.GetLength(1); i++)
{
maxc = Math.Max(maxc, matrix[i, j]);
}
if ( set .Contains(maxc))
{
res.Add(maxc);
}
}
return res;
}
public static void Main(String[] args)
{
int [,] mat = {{1, 10, 4},
{9, 3, 8},
{15, 16, 17}};
List< int > ans = new List< int >();
ans = minmaxNumbers(mat, ans);
if (ans.Count == 0)
Console.WriteLine( "-1" );
for ( int i = 0; i < ans.Count; i++)
Console.WriteLine(ans[i]);
}
}
|
Javascript
<script>
function minmaxNumbers(matrix, res)
{
var set = new Set();
for ( var i = 0; i < matrix.length; i++) {
var minr = 1000000000;
for ( var j = 0; j < matrix[i].length; j++) {
minr = Math.min(minr, matrix[i][j]);
}
set.add(minr);
}
for ( var j = 0; j < matrix[0].length; j++) {
var maxc = -1000000000;
for ( var i = 0; i < matrix.length; i++) {
maxc = Math.max(maxc, matrix[i][j]);
}
if (set.has(maxc)) {
res.push(maxc);
}
}
return res;
}
var mat
= [ [ 1, 10, 4 ],
[ 9, 3, 8 ],
[ 15, 16, 17 ] ];
var ans = [];
minmaxNumbers(mat, ans);
if (ans.length == 0)
document.write( "-1" );
for ( var i = 0; i < ans.length; i++)
document.write( ans[i] + "<br>" );
</script>
|
Time Complexity: O(M * N)
Auxiliary Space: O(M + N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...