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/