给定两个数组表示的两个集合,如何检查给定的两个集合是否不相交?可以假定给定的数组没有重复项。
Input: set1[] = {12, 34, 11, 9, 3}
set2[] = {2, 1, 3, 5}
Output: Not Disjoint
3 is common in two sets.
Input: set1[] = {12, 34, 11, 9, 3}
set2[] = {7, 2, 1, 5}
Output: Yes, Disjoint
There is no common element in two sets.
有很多方法可以解决此问题,这是一个很好的测试,可以检查可以猜到多少解决方案。
方法1(简单)
遍历第一个集合的每个元素,然后在另一个集合中进行搜索,如果找到任何元素,则返回false。如果未找到任何元素,则返回树。该方法的时间复杂度为O(mn)。
以下是上述想法的实现。
C++
// A Simple C++ program to check if two sets are disjoint
#include
using namespace std;
// Returns true if set1[] and set2[] are disjoint, else false
bool areDisjoint(int set1[], int set2[], int m, int n)
{
// Take every element of set1[] and search it in set2
for (int i=0; i
Java
// Java program to check if two sets are disjoint
public class disjoint1
{
// Returns true if set1[] and set2[] are
// disjoint, else false
boolean aredisjoint(int set1[], int set2[])
{
// Take every element of set1[] and
// search it in set2
for (int i = 0; i < set1.length; i++)
{
for (int j = 0; j < set2.length; j++)
{
if (set1[i] == set2[j])
return false;
}
}
// If no element of set1 is present in set2
return true;
}
// Driver program to test above function
public static void main(String[] args)
{
disjoint1 dis = new disjoint1();
int set1[] = { 12, 34, 11, 9, 3 };
int set2[] = { 7, 2, 1, 5 };
boolean result = dis.aredisjoint(set1, set2);
if (result)
System.out.println("Yes");
else
System.out.println("No");
}
}
// This code is contributed by Rishabh Mahrsee
Python
# A Simple python 3 program to check
# if two sets are disjoint
# Returns true if set1[] and set2[] are disjoint, else false
def areDisjoint(set1, set2, m, n):
# Take every element of set1[] and search it in set2
for i in range(0, m):
for j in range(0, n):
if (set1[i] == set2[j]):
return False
# If no element of set1 is present in set2
return True
# Driver program
set1 = [12, 34, 11, 9, 3]
set2 = [7, 2, 1, 5]
m = len(set1)
n = len(set2)
print("yes") if areDisjoint(set1, set2, m, n) else(" No")
# This code ia contributed by Smitha Dinesh Semwal
C#
// C# program to check if two
// sets are disjoint
using System;
class GFG
{
// Returns true if set1[] and set2[]
// are disjoint, else false
public virtual bool aredisjoint(int[] set1,
int[] set2)
{
// Take every element of set1[]
// and search it in set2
for (int i = 0; i < set1.Length; i++)
{
for (int j = 0;
j < set2.Length; j++)
{
if (set1[i] == set2[j])
{
return false;
}
}
}
// If no element of set1 is
// present in set2
return true;
}
// Driver Code
public static void Main(string[] args)
{
GFG dis = new GFG();
int[] set1 = new int[] {12, 34, 11, 9, 3};
int[] set2 = new int[] {7, 2, 1, 5};
bool result = dis.aredisjoint(set1, set2);
if (result)
{
Console.WriteLine("Yes");
}
else
{
Console.WriteLine("No");
}
}
}
// This code is contributed by Shrikant13
PHP
Javascript
C++
// A Simple C++ program to check if two sets are disjoint
#include
using namespace std;
// Returns true if set1[] and set2[] are disjoint, else false
bool areDisjoint(int set1[], int set2[], int m, int n)
{
// Sort the given two sets
sort(set1, set1+m);
sort(set2, set2+n);
// Check for same elements using merge like process
int i = 0, j = 0;
while (i < m && j < n)
{
if (set1[i] < set2[j])
i++;
else if (set2[j] < set1[i])
j++;
else /* if set1[i] == set2[j] */
return false;
}
return true;
}
// Driver program to test above function
int main()
{
int set1[] = {12, 34, 11, 9, 3};
int set2[] = {7, 2, 1, 5};
int m = sizeof(set1)/sizeof(set1[0]);
int n = sizeof(set2)/sizeof(set2[0]);
areDisjoint(set1, set2, m, n)? cout << "Yes" : cout << " No";
return 0;
}
Java
// Java program to check if two sets are disjoint
import java.util.Arrays;
public class disjoint1
{
// Returns true if set1[] and set2[] are
// disjoint, else false
boolean aredisjoint(int set1[], int set2[])
{
int i=0,j=0;
// Sort the given two sets
Arrays.sort(set1);
Arrays.sort(set2);
// Check for same elements using
// merge like process
while(iset2[j])
j++;
else
return false;
}
return true;
}
// Driver program to test above function
public static void main(String[] args)
{
disjoint1 dis = new disjoint1();
int set1[] = { 12, 34, 11, 9, 3 };
int set2[] = { 7, 2, 1, 5 };
boolean result = dis.aredisjoint(set1, set2);
if (result)
System.out.println("YES");
else
System.out.println("NO");
}
}
// This code is contributed by Rishabh Mahrsee
Python3
# A Simple Python 3 program to check
# if two sets are disjoint
# Returns true if set1[] and set2[]
# are disjoint, else false
def areDisjoint(set1, set2, m, n):
# Sort the given two sets
set1.sort()
set2.sort()
# Check for same elements
# using merge like process
i = 0; j = 0
while (i < m and j < n):
if (set1[i] < set2[j]):
i += 1
elif (set2[j] < set1[i]):
j += 1
else: # if set1[i] == set2[j]
return False
return True
# Driver Code
set1 = [12, 34, 11, 9, 3]
set2 = [7, 2, 1, 5]
m = len(set1)
n = len(set2)
print("Yes") if areDisjoint(set1, set2, m, n) else print("No")
# This code is contributed by Smitha Dinesh Semwal
C#
// C# program to check if two sets are disjoint
using System;
public class disjoint1
{
// Returns true if set1[] and set2[] are
// disjoint, else false
Boolean aredisjoint(int []set1, int []set2)
{
int i = 0, j = 0;
// Sort the given two sets
Array.Sort(set1);
Array.Sort(set2);
// Check for same elements using
// merge like process
while(i < set1.Length && j < set2.Length)
{
if(set1[i] < set2[j])
i++;
else if(set1[i] > set2[j])
j++;
else
return false;
}
return true;
}
// Driver code
public static void Main(String[] args)
{
disjoint1 dis = new disjoint1();
int []set1 = { 12, 34, 11, 9, 3 };
int []set2 = { 7, 2, 1, 5 };
Boolean result = dis.aredisjoint(set1, set2);
if (result)
Console.WriteLine("YES");
else
Console.WriteLine("NO");
}
}
// This code contributed by Rajput-Ji
Javascript
C++
/* C++ program to check if two sets are distinct or not */
#include
using namespace std;
// This function prints all distinct elements
bool areDisjoint(int set1[], int set2[], int n1, int n2)
{
// Creates an empty hashset
set myset;
// Traverse the first set and store its elements in hash
for (int i = 0; i < n1; i++)
myset.insert(set1[i]);
// Traverse the second set and check if any element of it
// is already in hash or not.
for (int i = 0; i < n2; i++)
if (myset.find(set2[i]) != myset.end())
return false;
return true;
}
// Driver method to test above method
int main()
{
int set1[] = {10, 5, 3, 4, 6};
int set2[] = {8, 7, 9, 3};
int n1 = sizeof(set1) / sizeof(set1[0]);
int n2 = sizeof(set2) / sizeof(set2[0]);
if (areDisjoint(set1, set2, n1, n2))
cout << "Yes";
else
cout << "No";
}
//This article is contributed by Chhavi
Java
/* Java program to check if two sets are distinct or not */
import java.util.*;
class Main
{
// This function prints all distinct elements
static boolean areDisjoint(int set1[], int set2[])
{
// Creates an empty hashset
HashSet set = new HashSet<>();
// Traverse the first set and store its elements in hash
for (int i=0; i
Python3
# Python3 program to
# check if two sets are
# distinct or not
# This function prints
# all distinct elements
def areDisjoint(set1, set2,
n1, n2):
# Creates an empty hashset
myset = set([])
# Traverse the first set
# and store its elements in hash
for i in range (n1):
myset.add(set1[i])
# Traverse the second set
# and check if any element of it
# is already in hash or not.
for i in range (n2):
if (set2[i] in myset):
return False
return True
# Driver method to test above method
if __name__ == "__main__":
set1 = [10, 5, 3, 4, 6]
set2 = [8, 7, 9, 3]
n1 = len(set1)
n2 = len(set2)
if (areDisjoint(set1, set2,
n1, n2)):
print ("Yes")
else:
print("No")
# This code is contributed by Chitranayal
C#
using System;
using System.Collections.Generic;
/* C# program to check if two sets are distinct or not */
public class GFG
{
// This function prints all distinct elements
public static bool areDisjoint(int[] set1, int[] set2)
{
// Creates an empty hashset
HashSet set = new HashSet();
// Traverse the first set and store its elements in hash
for (int i = 0; i < set1.Length; i++)
{
set.Add(set1[i]);
}
// Traverse the second set and check if any element of it
// is already in hash or not.
for (int i = 0; i < set2.Length; i++)
{
if (set.Contains(set2[i]))
{
return false;
}
}
return true;
}
// Driver method to test above method
public static void Main(string[] args)
{
int[] set1 = new int[] {10, 5, 3, 4, 6};
int[] set2 = new int[] {8, 7, 9, 3};
if (areDisjoint(set1, set2))
{
Console.WriteLine("Yes");
}
else
{
Console.WriteLine("No");
}
}
}
//This code is contributed by Shrikant13
输出 :
Yes
方法2(使用排序和合并)
1)对第一和第二组进行排序。
2)像过程一样使用合并来比较元素。
以下是上述想法的实现。
C++
// A Simple C++ program to check if two sets are disjoint
#include
using namespace std;
// Returns true if set1[] and set2[] are disjoint, else false
bool areDisjoint(int set1[], int set2[], int m, int n)
{
// Sort the given two sets
sort(set1, set1+m);
sort(set2, set2+n);
// Check for same elements using merge like process
int i = 0, j = 0;
while (i < m && j < n)
{
if (set1[i] < set2[j])
i++;
else if (set2[j] < set1[i])
j++;
else /* if set1[i] == set2[j] */
return false;
}
return true;
}
// Driver program to test above function
int main()
{
int set1[] = {12, 34, 11, 9, 3};
int set2[] = {7, 2, 1, 5};
int m = sizeof(set1)/sizeof(set1[0]);
int n = sizeof(set2)/sizeof(set2[0]);
areDisjoint(set1, set2, m, n)? cout << "Yes" : cout << " No";
return 0;
}
Java
// Java program to check if two sets are disjoint
import java.util.Arrays;
public class disjoint1
{
// Returns true if set1[] and set2[] are
// disjoint, else false
boolean aredisjoint(int set1[], int set2[])
{
int i=0,j=0;
// Sort the given two sets
Arrays.sort(set1);
Arrays.sort(set2);
// Check for same elements using
// merge like process
while(iset2[j])
j++;
else
return false;
}
return true;
}
// Driver program to test above function
public static void main(String[] args)
{
disjoint1 dis = new disjoint1();
int set1[] = { 12, 34, 11, 9, 3 };
int set2[] = { 7, 2, 1, 5 };
boolean result = dis.aredisjoint(set1, set2);
if (result)
System.out.println("YES");
else
System.out.println("NO");
}
}
// This code is contributed by Rishabh Mahrsee
Python3
# A Simple Python 3 program to check
# if two sets are disjoint
# Returns true if set1[] and set2[]
# are disjoint, else false
def areDisjoint(set1, set2, m, n):
# Sort the given two sets
set1.sort()
set2.sort()
# Check for same elements
# using merge like process
i = 0; j = 0
while (i < m and j < n):
if (set1[i] < set2[j]):
i += 1
elif (set2[j] < set1[i]):
j += 1
else: # if set1[i] == set2[j]
return False
return True
# Driver Code
set1 = [12, 34, 11, 9, 3]
set2 = [7, 2, 1, 5]
m = len(set1)
n = len(set2)
print("Yes") if areDisjoint(set1, set2, m, n) else print("No")
# This code is contributed by Smitha Dinesh Semwal
C#
// C# program to check if two sets are disjoint
using System;
public class disjoint1
{
// Returns true if set1[] and set2[] are
// disjoint, else false
Boolean aredisjoint(int []set1, int []set2)
{
int i = 0, j = 0;
// Sort the given two sets
Array.Sort(set1);
Array.Sort(set2);
// Check for same elements using
// merge like process
while(i < set1.Length && j < set2.Length)
{
if(set1[i] < set2[j])
i++;
else if(set1[i] > set2[j])
j++;
else
return false;
}
return true;
}
// Driver code
public static void Main(String[] args)
{
disjoint1 dis = new disjoint1();
int []set1 = { 12, 34, 11, 9, 3 };
int []set2 = { 7, 2, 1, 5 };
Boolean result = dis.aredisjoint(set1, set2);
if (result)
Console.WriteLine("YES");
else
Console.WriteLine("NO");
}
}
// This code contributed by Rajput-Ji
Java脚本
输出 :
Yes
上述解决方案的时间复杂度为O(mLogm + nLogn)。
上面的解决方案首先对两个集合进行排序,然后花费O(m + n)的时间来找到交点。如果给定输入集已排序,则此方法是所有方法中最好的。
方法3(使用排序和二进制搜索)
这类似于方法1。我们使用二进制搜索代替线性搜索。
1)排序第一组。
2)遍历第二组的每个元素,并使用二进制搜索来搜索第一组的每个元素。如果找到一个元素,则将其返回。
该方法的时间复杂度为O(mLogm + nLogm)
方法4(使用二进制搜索树)
1)为第一组中的所有元素创建一个自平衡二进制搜索树(红黑色,AVL,Splay等)。
2)遍历第二组的所有元素,并在上述构造的二叉搜索树中搜索每个元素。如果找到该元素,则返回false。
3)如果所有元素都不存在,则返回true。
此方法的时间复杂度为O(mLogm + nLogm)。
方法5(使用散列)
1)创建一个空的哈希表。
2)遍历第一组并将每个元素存储在哈希表中。
3)遍历第二组并检查哈希表中是否存在任何元素。如果存在,则返回false,否则忽略该元素。
4)如果第二组的所有元素都没有出现在哈希表中,则返回true。
以下是此方法的实现。
C++
/* C++ program to check if two sets are distinct or not */
#include
using namespace std;
// This function prints all distinct elements
bool areDisjoint(int set1[], int set2[], int n1, int n2)
{
// Creates an empty hashset
set myset;
// Traverse the first set and store its elements in hash
for (int i = 0; i < n1; i++)
myset.insert(set1[i]);
// Traverse the second set and check if any element of it
// is already in hash or not.
for (int i = 0; i < n2; i++)
if (myset.find(set2[i]) != myset.end())
return false;
return true;
}
// Driver method to test above method
int main()
{
int set1[] = {10, 5, 3, 4, 6};
int set2[] = {8, 7, 9, 3};
int n1 = sizeof(set1) / sizeof(set1[0]);
int n2 = sizeof(set2) / sizeof(set2[0]);
if (areDisjoint(set1, set2, n1, n2))
cout << "Yes";
else
cout << "No";
}
//This article is contributed by Chhavi
Java
/* Java program to check if two sets are distinct or not */
import java.util.*;
class Main
{
// This function prints all distinct elements
static boolean areDisjoint(int set1[], int set2[])
{
// Creates an empty hashset
HashSet set = new HashSet<>();
// Traverse the first set and store its elements in hash
for (int i=0; i
Python3
# Python3 program to
# check if two sets are
# distinct or not
# This function prints
# all distinct elements
def areDisjoint(set1, set2,
n1, n2):
# Creates an empty hashset
myset = set([])
# Traverse the first set
# and store its elements in hash
for i in range (n1):
myset.add(set1[i])
# Traverse the second set
# and check if any element of it
# is already in hash or not.
for i in range (n2):
if (set2[i] in myset):
return False
return True
# Driver method to test above method
if __name__ == "__main__":
set1 = [10, 5, 3, 4, 6]
set2 = [8, 7, 9, 3]
n1 = len(set1)
n2 = len(set2)
if (areDisjoint(set1, set2,
n1, n2)):
print ("Yes")
else:
print("No")
# This code is contributed by Chitranayal
C#
using System;
using System.Collections.Generic;
/* C# program to check if two sets are distinct or not */
public class GFG
{
// This function prints all distinct elements
public static bool areDisjoint(int[] set1, int[] set2)
{
// Creates an empty hashset
HashSet set = new HashSet();
// Traverse the first set and store its elements in hash
for (int i = 0; i < set1.Length; i++)
{
set.Add(set1[i]);
}
// Traverse the second set and check if any element of it
// is already in hash or not.
for (int i = 0; i < set2.Length; i++)
{
if (set.Contains(set2[i]))
{
return false;
}
}
return true;
}
// Driver method to test above method
public static void Main(string[] args)
{
int[] set1 = new int[] {10, 5, 3, 4, 6};
int[] set2 = new int[] {8, 7, 9, 3};
if (areDisjoint(set1, set2))
{
Console.WriteLine("Yes");
}
else
{
Console.WriteLine("No");
}
}
}
//This code is contributed by Shrikant13
输出:
No