Cho một mảng arr gồm n số nguyên, ta cần tìm arr[i] và arr[j] sao cho arr[i]Carr[j] (tổ hợp chập arr[j] của arr[i]) là lớn nhất có thể. Nếu có nhiều cặp, trả về bất kỳ cặp nào.
Ví dụ, nếu đầu vào là [4, 1, 2], kết quả sẽ là 4 2 vì 4C1 = 4, 4C2 = 6 và 2C1 = 2, nên cặp (4,2) là cặp cần tìm.
Thuật toán giải quyết
- Sắp xếp mảng
v. N := v[n - 1](phần tử lớn nhất).- Nếu
Nlẻ:first := N // 2,second := first + 1.- Khởi tạo
left := -1,right := -1,temp := -1,res1 := 3 * 10¹⁸. - Duyệt
itừ 0 đếnn-1:- Nếu
v[i] > first:temp := i, thoát vòng lặp. - Ngược lại:
difference := first - v[i]. Nếudifference < res1thì cập nhậtres1vàleft := v[i].
- Nếu
right := v[temp].difference1 := first - left,difference2 := right - second.- Nếu
difference1 < difference2inN, left, ngược lại inN, right.
- Ngược lại (
Nchẵn):max := N // 2,res := 3 * 10¹⁸,R := -1.- Duyệt
itừ 0 đếnn-2:difference := abs(v[i] - max).- Nếu
difference < res: cập nhậtresvàR := v[i].
- In
N, R.
Ví dụ minh họa
def findMatrixPair(v, n):
v.sort()
N = v[n - 1]
if N % 2 == 1:
first = N // 2
second = first + 1
res1, res2 = 3 * (10 ** 18), 3 * (10 ** 18)
left, right = -1, -1
temp = -1
for i in range(0, n):
if v[i] > first:
temp = i
break
else:
difference = first - v[i]
if difference < res1:
res1 = difference
left = v[i]
right = v[temp]
difference1 = first - left
difference2 = right - second
if difference1 < difference2:
print(N, left)
else:
print(N, right)
else:
max_val = N // 2
res = 3 * (10 ** 18)
R = -1
for i in range(0, n - 1):
difference = abs(v[i] - max_val)
if difference < res:
res = difference
R = v[i]
print(N, R)
v = [4, 1, 2]
n = len(v)
findMatrixPair(v, n) # Output: 4 2
Đầu vào
[4,1,2], 3
Đầu ra
4 2