与集合不同,多重集合可能包含多次出现的相同数字。多重集等价问题声明检查两个给定的多重集是否相等。例如让A = {1, 2, 3} 和B = {1, 1, 2, 3}。这里A已设置但B未设置(1 在 B 中出现两次),而A和B都是多重集。更正式地说,“对的集合是否定义为两个给定的多重集相等吗?”
给定两个多重集 A 和 B,编写一个程序来检查这两个多重集是否相等。
注意:多重集中的元素可以是 10 9的阶数
例子:
Input : A = {1, 1, 3, 4},
B = {1, 1, 3, 4}
Output : Yes
Input : A = {1, 3},
B = {1, 1}
Output : No
由于元素大到 10^9 我们不能使用直接索引表。
一种解决方案是对两个多重集进行排序并一一比较。
C++
// C++ program to check if two given multisets
// are equivalent
#include
using namespace std;
bool areSame(vector& a, vector& b)
{
// sort the elements of both multisets
sort(a.begin(), a.end());
sort(b.begin(), b.end());
// Return true if both multisets are same.
return (a == b);
}
int main()
{
vector a({ 7, 7, 5 }), b({ 7, 5, 5 });
if (areSame(a, b))
cout << "Yes\n";
else
cout << "No\n";
return 0;
}
Java
// Java program to check if two given multisets
// are equivalent
import java.util.*;
class GFG {
static boolean areSame(Vectora, Vectorb)
{
// sort the elements of both multisets
Collections.sort(a);
Collections.sort(b);
// Return true if both multisets are same.
return (a == b);
}
public static void main(String[] args) {
Vector a = new Vector(Arrays.asList( 7, 7, 5 ));
Vector b = new Vector(Arrays.asList( 7, 5, 5));
if (areSame(a, b))
System.out.print("Yes\n");
else
System.out.print("No\n");
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 program to check if
# two given multisets are equivalent
def areSame(a, b):
# sort the elements of both multisets
a.sort();
b.sort();
# Return true if both multisets are same.
return (a == b);
# Driver Code
a = [ 7, 7, 5 ];
b = [ 7, 5, 5 ];
if (areSame(a, b)):
print("Yes");
else:
print("No");
# This code is contributed by Princi Singh
C#
// C# program to check if two given multisets
// are equivalent
using System;
using System.Collections.Generic;
class GFG
{
static bool areSame(Lista, Listb)
{
// sort the elements of both multisets
a.Sort();
b.Sort();
// Return true if both multisets are same.
return (a == b);
}
// Driver code
public static void Main()
{
List a = new List { 7, 7, 5 };
List b = new List { 7, 5, 5 };
if (areSame(a, b))
Console.WriteLine("Yes\n");
else
Console.WriteLine("No\n");
}
}
// This code is contributed by Rajput-Ji
Javascript
C++
// C++ program to check if two given multisets
// are equivalent
#include
using namespace std;
bool areSame(vector& a, vector& b)
{
if (a.size() != b.size())
return false;
// Create two unordered maps m1 and m2
// and insert values of both vectors.
unordered_map m1, m2;
for (int i = 0; i < a.size(); i++) {
m1[a[i]]++;
m2[b[i]]++;
}
// Now we check if both unordered_maps
// are same of not.
for (auto x : m1) {
if (m2.find(x.first) == m2.end() ||
m2[x.first] != x.second)
return false;
}
return true;
}
// Driver code
int main()
{
vector a({ 7, 7, 5 }), b({ 7, 7, 5 });
if (areSame(a, b))
cout << "Yes\n";
else
cout << "No\n";
return 0;
}
Java
// Java program to check if two given multisets
// are equivalent
import java.util.*;
class GFG
{
static boolean areSame(int []a, int []b)
{
if (a.length != b.length)
return false;
// Create two unordered maps m1 and m2
// and insert values of both vectors.
HashMap m1, m2;
m1 = new HashMap();
m2 = new HashMap();
for (int i = 0; i < a.length; i++)
{
if(m1.containsKey(a[i]))
{
m1.put(a[i], m1.get(a[i]) + 1);
}
else
{
m1.put(a[i], 1);
}
if(m2.containsKey(b[i]))
{
m2.put(b[i], m2.get(b[i]) + 1);
}
else
{
m2.put(b[i], 1);
}
}
// Now we check if both unordered_maps
// are same of not.
for (Map.Entry x : m1.entrySet())
{
if (!m2.containsKey(x.getKey()) ||
m2.get(x.getKey()) != x.getValue())
return false;
}
return true;
}
// Driver code
public static void main(String args[])
{
int []a = { 7, 7, 5 };
int []b = { 7, 7, 5 };
if (areSame(a, b))
System.out.println("Yes");
else
System.out.println("No");
}
}
// This code is contributed by 29AjayKumar
C#
// C# program to check if two given multisets
// are equivalent
using System;
using System.Collections.Generic;
class GFG
{
static bool areSame(int []a, int []b)
{
if (a.Length != b.Length)
return false;
// Create two unordered maps m1 and m2
// and insert values of both vectors.
Dictionary m1, m2;
m1 = new Dictionary();
m2 = new Dictionary();
for (int i = 0; i < a.Length; i++)
{
if(m1.ContainsKey(a[i]))
{
m1[a[i]] = m1[a[i]] + 1;
}
else
{
m1.Add(a[i], 1);
}
if(m2.ContainsKey(b[i]))
{
m2[b[i]] = m2[b[i]] + 1;
}
else
{
m2.Add(b[i], 1);
}
}
// Now we check if both unordered_maps
// are same of not.
foreach(KeyValuePair x in m1)
{
if (!m2.ContainsKey(x.Key) ||
m2[x.Key] != x.Value)
return false;
}
return true;
}
// Driver code
public static void Main(String []args)
{
int []a = { 7, 7, 5 };
int []b = { 7, 7, 5 };
if (areSame(a, b))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
No
更好的解决方案是使用散列。我们创建了两个空的哈希表(在 C++ 中使用 unordered_map 实现)。我们首先在第一个表中插入第一个多重映射的所有项目,在第二个表中插入第二个多重集的所有项目。现在我们检查两个哈希表是否包含相同的项目和频率。
C++
// C++ program to check if two given multisets
// are equivalent
#include
using namespace std;
bool areSame(vector& a, vector& b)
{
if (a.size() != b.size())
return false;
// Create two unordered maps m1 and m2
// and insert values of both vectors.
unordered_map m1, m2;
for (int i = 0; i < a.size(); i++) {
m1[a[i]]++;
m2[b[i]]++;
}
// Now we check if both unordered_maps
// are same of not.
for (auto x : m1) {
if (m2.find(x.first) == m2.end() ||
m2[x.first] != x.second)
return false;
}
return true;
}
// Driver code
int main()
{
vector a({ 7, 7, 5 }), b({ 7, 7, 5 });
if (areSame(a, b))
cout << "Yes\n";
else
cout << "No\n";
return 0;
}
Java
// Java program to check if two given multisets
// are equivalent
import java.util.*;
class GFG
{
static boolean areSame(int []a, int []b)
{
if (a.length != b.length)
return false;
// Create two unordered maps m1 and m2
// and insert values of both vectors.
HashMap m1, m2;
m1 = new HashMap();
m2 = new HashMap();
for (int i = 0; i < a.length; i++)
{
if(m1.containsKey(a[i]))
{
m1.put(a[i], m1.get(a[i]) + 1);
}
else
{
m1.put(a[i], 1);
}
if(m2.containsKey(b[i]))
{
m2.put(b[i], m2.get(b[i]) + 1);
}
else
{
m2.put(b[i], 1);
}
}
// Now we check if both unordered_maps
// are same of not.
for (Map.Entry x : m1.entrySet())
{
if (!m2.containsKey(x.getKey()) ||
m2.get(x.getKey()) != x.getValue())
return false;
}
return true;
}
// Driver code
public static void main(String args[])
{
int []a = { 7, 7, 5 };
int []b = { 7, 7, 5 };
if (areSame(a, b))
System.out.println("Yes");
else
System.out.println("No");
}
}
// This code is contributed by 29AjayKumar
C#
// C# program to check if two given multisets
// are equivalent
using System;
using System.Collections.Generic;
class GFG
{
static bool areSame(int []a, int []b)
{
if (a.Length != b.Length)
return false;
// Create two unordered maps m1 and m2
// and insert values of both vectors.
Dictionary m1, m2;
m1 = new Dictionary();
m2 = new Dictionary();
for (int i = 0; i < a.Length; i++)
{
if(m1.ContainsKey(a[i]))
{
m1[a[i]] = m1[a[i]] + 1;
}
else
{
m1.Add(a[i], 1);
}
if(m2.ContainsKey(b[i]))
{
m2[b[i]] = m2[b[i]] + 1;
}
else
{
m2.Add(b[i], 1);
}
}
// Now we check if both unordered_maps
// are same of not.
foreach(KeyValuePair x in m1)
{
if (!m2.ContainsKey(x.Key) ||
m2[x.Key] != x.Value)
return false;
}
return true;
}
// Driver code
public static void Main(String []args)
{
int []a = { 7, 7, 5 };
int []b = { 7, 7, 5 };
if (areSame(a, b))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
Yes
时间复杂度: O(n) 假设 unordered_map find() 和 insert() 操作在 O(1) 时间内工作。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。