Cho một mảng có size bằng n. Chứa các số được ramdom từ 1 đến n – 1, và mảng chỉ có duy nhất một phần x tử bị trùng lặp, tìm x.
Ví dụ:
Input: arr[] = {1, 2, 3, 2, 4}
Output: 2
Input: arr[] = {3, 1, 2, 4, 6, 5, 3}
Output: = 3
Cách 1: Sử dụng 2 vòng lặp for
B1: Khởi tạo i = 0; B2: Loop i từ 0 đến N - 2 + Khởi tạo j = i + 1 + Loop j từ i + 1 đến N - 1 -> Nếu arr[i] == arr[j] return arr[i]
public class Main { public static void main(String[] args) { int[] arr = {1, 2, 3, 1, 4, 5, 6}; System.out.println("Element repetitive is: " + findRepeat(arr, arr.length)); } public static int findRepeat(int[] arr, int n) { for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (arr[i] == arr[j]) return arr[i]; } } return -1; } }
Output: Element repetitive is: 1
Độ phức tạp: θ(n2)
Cách 2: Công thức tổng quát
Ta có 1 + 2 + 3 + … + n – 1 = n(n – 1)/2.
Tổng các phần tử của mảng là: 1 + 2 + 3 + n – 1 + x, với x là một số bị lặp lại có giá trị trong khoảng [1, n].
=> Sum(arr0->n-1)) – Sum(n * (n – 1)/2)) = x
public class Main { public static void main(String[] args) { int[] arr = {1, 2, 3, 1, 4, 5, 6}; System.out.println("Element repetitive is: " + findRepeat(arr, arr.length)); } public static int findRepeat(int[] arr, int n) { int sum = 0; for(int value : arr) { sum += value; } int formula = n * (n - 1) / 2; return sum - formula; } }
Output: Element repetitive is: 1
Độ phức tạp: θ(n) chi phí duyệt mảng để tính tổng tất cả các phần tử.
Cách 3: Sử dụng HasSet
B1: Khởi tạo HashSet s B2: Loop mỗi phần tử i trong mảng + Nếu s chứa arr[i] return arr[i] + Ngược lại thêm arr[i] vào s
import java.util.HashSet; import java.util.Map; import java.util.Set; public class Main { public static void main(String[] args) { int[] arr = {1, 2, 3, 1, 4, 5, 6}; System.out.println("Element repetitive is: " + findRepeat(arr, arr.length)); } public static int findRepeat(int[] arr, int n) { Set set = new HashSet(); for(int value : arr) { if (set.contains(value)) return value; else set.add(value); } return -1; } }
Output: Element repetitive is: 1
Độ phức tạp: θ(n) chi phí duyệt mảng.
Link full source-code: source
Nguồn tham khảo: geeksforgeeks