📌  相关文章
📜  给定矩阵的所有行中的公共元素

📅  最后修改于: 2021-10-27 16:55:08             🧑  作者: Mango

给定一个 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 现场工作专业课程学生竞争性编程现场课程