Cho một mảng số nguyên gồm n phần tử. Tìm 2 phần tử có tổng gần bằng 0 nhất.
Ví dụ:
Input: arr[] = {1, 60, -10, 70, -80, 85};
Output: {-80, 85}
Thật chất đề bài trên chúng ta có thể hiểu theo cách khác đó chính là tìm cặp số có trị tuyệt đối nhỏ nhất
Cách 1 Sử dụng 2 vòng lặp
Sử dụng 2 vòng lặp để tìm tất cả các tổng của một số với các số còn lại trong mảng, sau đó lấy trị tuyệt đối để so sánh.
public class Main { public static void findMinSumAbs(int[] arr, int n) { if (n == 2) { System.out.println("Khong tim thay"); return; } int e1 = -1, e2 = -1, minSum = Integer.MAX_VALUE; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (Math.abs(arr[i] + arr[j]) < minSum) { minSum = Math.abs(arr[i] + arr[j]); e1 = arr[i]; e2 = arr[j]; } } } System.out.println("{" + e1 + "; " + e2 +"}"); } public static void main(String[] args) { int arr[] = {1, 60, -10, 70, -80, 85}; findMinSumAbs(arr, arr.length); } }
Output: {-80, 85}
Độ phức tạp: O(n2 )
Cách 2 Sắp xếp mảng
Sau khi mảng đã được sắp xếp, cặp số có trị tuyệt đối nhỏ nhất sẽ nằm cạnh nhau.
B1: Sắp xếp mảng |
import java.util.Arrays; import java.util.Map; public class Main { public static void findMinSubAbsSort(int[] arr, int n) { if (n == 2) { System.out.println("Khong tim thay"); return; } // Sắp xếp mảng Arrays.sort(arr); // Khởi tạo int e1 = 0, e2 = n-1, minSum = Integer.MAX_VALUE; // Lưu vị trí cặp số có trị tuyệt đối nhỏ nhất int min_e1 = 0, min_e2 = n-1; // Duyệt và tìm kiếm cặp số thoả điều kiện while (e1 < e2) { int sum = arr[e1] + arr[e2]; if (Math.abs(sum) < Math.abs(minSum)) { minSum = sum; min_e1 = e1; min_e2 = e2; } if (sum < 0) e1++; else e2--; } // Xuất kết quả System.out.println("{" + arr[min_e1] + "; " + arr[min_e2] +"}"); } public static void main(String[] args) { int arr[] = {1, 60, -10, 70, -80, 85}; findMinSubAbsSort(arr, arr.length); } }
Output: {-80, 85}
Độ phức tạp: O(nlogn )
Độ phức tạp của cách 2 phụ thuộc vào thuật toán sắp xếp mà các bạn chọn nhé.
Link đề bài: https://www.geeksforgeeks.org/two-elements-whose-sum-is-closest-to-zero/