Cho 2 mảng số nguyên A và có có n và m phần tử. Mỗi phần tử là duy nhất trong 2 mảng A và B. Tìm phần giao của 2 mảng. n, m > 0
Ví dụ
Input: A[] = {1, 3, 5, 7, 8, 2}, B = {3, 4, 0, 2}
Output: 3, 2
Cách 1: Sử dụng vòng lặp
public class Main { public static void printUnion(int[] A, int[] B, int n, int m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (A[i] == B[j]) System.out.print(A[i] + " "); } } } public static void main(String[] args) { int[] A = {1, 3, 5, 7, 8, 2}; int[] B = {3, 4, 0 , 2}; printUnion(A, B, A.length, B.length); } }
Output: 3, 2
Độ phức tạp: O(n2)
Cách 2: Sắp xếp
B1: Sắp xếp A và B B2: Khởi tạo index_a = 0, index_b = 0 B3: Trong khi index_a < n và index_b < m, với mỗi A[index_a] và B[index_b] 1. if A[index_a] == B[index_b] index_a++ index_b++ xuất A[index_a] hoặc B[index_b] 2. else if A[index_a] > B[index_b] thì index_b++ 3. else index_a++ |
import java.util.Arrays; public class Main { public static void printUnionSort(int[] A, int[] B, int n, int m) { Arrays.sort(A); Arrays.sort(B); int index_a = 0, index_b = 0; while (index_a < n && index_b < m) { if (A[index_a] == B[index_b]) { System.out.print(A[index_a] + " "); index_a++; index_b++; } else if (A[index_a] > A[index_b]) index_b++; else index_a++; } } public static void main(String[] args) { int[] A = {1, 3, 5, 7, 8, 2}; int[] B = {3, 4, 0, 2}; printUnionSort(A, B, A.length, B.length); } }
Output: 2, 3
Độ phức tạp: O(nlogn)
Link đề bài: https://www.geeksforgeeks.org/union-and-intersection-of-two-sorted-arrays-2/