给定一个 mxn 矩阵,在 O(mn) 时间和矩阵的一次遍历中找到所有行中存在的所有公共元素。
例子:
Input:
mat[4][5] = {{1, 2, 1, 4, 8},
{3, 7, 8, 5, 1},
{8, 7, 7, 3, 1},
{8, 1, 2, 7, 9},
};
Output:
1 8 or 8 1
8 and 1 are present in all rows.
一个简单的解决方案是考虑每个元素并检查它是否存在于所有行中。如果存在,则打印它。
更好的解决方案是对矩阵中的所有行进行排序,并使用此处讨论的类似方法。排序将花费 O(mnlogn) 时间,查找公共元素将花费 O(mn) 时间。所以这个解决方案的整体时间复杂度是 O(mnlogn)
我们能做得比 O(mnlogn) 更好吗?
这个想法是使用地图。我们最初在地图中插入第一行的所有元素。对于剩余行中的每个其他元素,我们检查它是否存在于地图中。如果它存在于地图中并且在当前行中没有重复,我们将地图中元素的计数增加 1,否则我们忽略该元素。如果当前遍历的行是最后一行,如果元素之前出现过 m-1 次,我们将打印该元素。
下面是这个想法的实现:
C++
// A Program to prints common element in all
// rows of matrix
#include
using namespace std;
// Specify number of rows and columns
#define M 4
#define N 5
// prints common element in all rows of matrix
void printCommonElements(int mat[M][N])
{
unordered_map mp;
// initialize 1st row elements with value 1
for (int j = 0; j < N; j++)
mp[mat[0][j]] = 1;
// traverse the matrix
for (int i = 1; i < M; i++)
{
for (int j = 0; j < N; j++)
{
// If element is present in the map and
// is not duplicated in current row.
if (mp[mat[i][j]] == i)
{
// we increment count of the element
// in map by 1
mp[mat[i][j]] = i + 1;
// If this is last row
if (i==M-1 && mp[mat[i][j]]==M)
cout << mat[i][j] << " ";
}
}
}
}
// driver program to test above function
int main()
{
int mat[M][N] =
{
{1, 2, 1, 4, 8},
{3, 7, 8, 5, 1},
{8, 7, 7, 3, 1},
{8, 1, 2, 7, 9},
};
printCommonElements(mat);
return 0;
}
Java
// Java Program to prints common element in all
// rows of matrix
import java.util.*;
class GFG
{
// Specify number of rows and columns
static int M = 4;
static int N =5;
// prints common element in all rows of matrix
static void printCommonElements(int mat[][])
{
Map mp = new HashMap<>();
// initialize 1st row elements with value 1
for (int j = 0; j < N; j++)
mp.put(mat[0][j],1);
// traverse the matrix
for (int i = 1; i < M; i++)
{
for (int j = 0; j < N; j++)
{
// If element is present in the map and
// is not duplicated in current row.
if (mp.get(mat[i][j]) != null && mp.get(mat[i][j]) == i)
{
// we increment count of the element
// in map by 1
mp.put(mat[i][j], i + 1);
// If this is last row
if (i == M - 1)
System.out.print(mat[i][j] + " ");
}
}
}
}
// Driver code
public static void main(String[] args)
{
int mat[][] =
{
{1, 2, 1, 4, 8},
{3, 7, 8, 5, 1},
{8, 7, 7, 3, 1},
{8, 1, 2, 7, 9},
};
printCommonElements(mat);
}
}
// This code contributed by Rajput-Ji
Python3
# A Program to prints common element
# in all rows of matrix
# Specify number of rows and columns
M = 4
N = 5
# prints common element in all
# rows of matrix
def printCommonElements(mat):
mp = dict()
# initialize 1st row elements
# with value 1
for j in range(N):
mp[mat[0][j]] = 1
# traverse the matrix
for i in range(1, M):
for j in range(N):
# If element is present in the
# map and is not duplicated in
# current row.
if (mat[i][j] in mp.keys() and
mp[mat[i][j]] == i):
# we increment count of the
# element in map by 1
mp[mat[i][j]] = i + 1
# If this is last row
if i == M - 1:
print(mat[i][j], end = " ")
# Driver Code
mat = [[1, 2, 1, 4, 8],
[3, 7, 8, 5, 1],
[8, 7, 7, 3, 1],
[8, 1, 2, 7, 9]]
printCommonElements(mat)
# This code is conteibuted
# by mohit kumar 29
C#
// C# Program to print common element in all
// rows of matrix to another.
using System;
using System.Collections.Generic;
class GFG
{
// Specify number of rows and columns
static int M = 4;
static int N = 5;
// prints common element in all rows of matrix
static void printCommonElements(int [,]mat)
{
Dictionary mp = new Dictionary();
// initialize 1st row elements with value 1
for (int j = 0; j < N; j++)
{
if(!mp.ContainsKey(mat[0, j]))
mp.Add(mat[0, j], 1);
}
// traverse the matrix
for (int i = 1; i < M; i++)
{
for (int j = 0; j < N; j++)
{
// If element is present in the map and
// is not duplicated in current row.
if (mp.ContainsKey(mat[i, j])&&
(mp[mat[i, j]] != 0 &&
mp[mat[i, j]] == i))
{
// we increment count of the element
// in map by 1
if(mp.ContainsKey(mat[i, j]))
{
var v = mp[mat[i, j]];
mp.Remove(mat[i, j]);
mp.Add(mat[i, j], i + 1);
}
else
mp.Add(mat[i, j], i + 1);
// If this is last row
if (i == M - 1)
Console.Write(mat[i, j] + " ");
}
}
}
}
// Driver code
public static void Main(String[] args)
{
int [,]mat = {{1, 2, 1, 4, 8},
{3, 7, 8, 5, 1},
{8, 7, 7, 3, 1},
{8, 1, 2, 7, 9}};
printCommonElements(mat);
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
8 1
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。