Mô tả bài toán
Cho danh sách nums. Chọn hai cặp số (4 chỉ số khác nhau) sao cho giá trị tuyệt đối của hiệu giữa tổng hai cặp là nhỏ nhất.
Ví dụ: nums = [3, 4, 5, 10, 7] → đầu ra 1 (cặp (3+7) và (4+5) cho hiệu 1).
Giải thuật
- Tạo danh sách
distanceschứa tất cả các cặp(|nums[i]-nums[j]|, i, j)vớii < j. - Sắp xếp
distancestheo giá trị chênh lệch. - Khởi tạo
ans = 1e9. - Duyệt
itừ 0 đếnlen(distances)-2:- Lấy
dist, i1, i2 = distances[i]. - Tìm
j = i+1sao cho 4 chỉ sối1,i2,i3,i4đều khác nhau (lặp tăngjnếu trùng). - Nếu tìm thấy 4 chỉ số khác nhau:
ans = min(ans, dist2 - dist).
- Lấy
- Trả về
ans.
Ví dụ mã Python
class Solution:
def solve(self, nums):
distances = []
for i in range(len(nums) - 1):
for j in range(i + 1, len(nums)):
distances.append((abs(nums[i] - nums[j]), i, j))
distances.sort()
ans = 1e9
for i in range(len(distances) - 1):
dist, i1, i2 = distances[i]
j = i + 1
dist2, i3, i4 = distances[j]
while j < len(distances) and len({i1, i2, i3, i4}) != 4:
dist2, i3, i4 = distances[j]
j += 1
if len({i1, i2, i3, i4}) == 4:
ans = min(ans, dist2 - dist)
return ans
ob = Solution()
nums = [3, 4, 5, 10, 7]
print(ob.solve(nums))
Đầu vào
[3, 4, 5, 10, 7]
Đầu ra
1