Cho danh sách nums và giá trị k. Đếm số tập con không rỗng S sao cho min(S) + max(S) <= k. Tập con là multiset (có thể trùng giá trị do tham chiếu đến phần tử cụ thể).
Ví dụ: nums = [2, 2, 5, 6], k = 7 → 6 (các tập: [2], [2], [2,2], [2,5], [2,5], [2,2,5]).
Quy trình giải quyết (Two Pointers + Powers of 2)
- Sắp xếp
A. - Khởi tạo
ans = 0,j = N - 1. - Với
itừ 0 đếnN-1:- Giảm
jcho đến khiA[i] + A[j] <= K. - Nếu
i <= jvà thỏa mãn:ans += 2^(j - i)(số tập con chứaA[i]làm min và max ≤A[j]).
- Giảm
- Trả về
ans.
Ví dụ mã nguồn
class Solution:
def solve(self, A, K):
N = len(A)
A.sort()
ans = 0
j = N - 1
for i in range(N):
while j and A[i] + A[j] > K:
j -= 1
if i <= j and A[i] + A[j] <= K:
ans += 1 << (j - i)
return ans
ob = Solution()
nums = [2, 2, 5, 6]
k = 7
print(ob.solve(nums, k)) # Output: 6
Đầu vào
[2, 2, 5, 6], 7
Đầu ra
6