สมมติว่ามีอาร์เรย์ nums1 และ nums2 ขนาดเท่ากัน และมีค่าบวก ความต่างสัมบูรณ์รวมคือผลรวมของ |nums1[i] - nums2[i]| สำหรับทุก i ตอนนี้เราสามารถแทนที่องค์ประกอบใน nums1 ได้มากสุด 1 ตัวด้วยองค์ประกอบอื่นใน nums1 เพื่อลดความต่างสัมบูรณ์รวมให้น้อยที่สุด ต้องคืนค่าความต่างสัมบูรณ์รวมขั้นต่ำหลังแทนที่ (มอดุลลอ 10^9 + 7)
ตัวอย่าง: nums1 = [2,8,6], nums2 = [3,4,6] ผลลัพธ์คือ 3 เพราะสามารถทำได้ 2 วิธี:
- แทนที่ดัชนี 1 ด้วยดัชนี 0:
[2,8,6] → [2,2,6] - แทนที่ดัชนี 1 ด้วยดัชนี 2:
[2,8,6] → [2,6,6]
ทั้งคู่ให้ผลรวม |2-3| + (|2-4| หรือ |6-4|) + |6-6| = 3
วิธีแก้ปัญหา
- ถ้า
nums1 == nums2ให้คืน0 minn_diff := -infinityind := -1- หาดัชนี
indที่มี|nums1[i] - nums2[i]|สูงสุด diff := |nums1[ind] - nums2[ind]|,index := ind- หา
indexที่ทำให้|nums1[i] - nums2[ind]|น้อยที่สุด (i != ind) - คำนวณ
summโดยใช้nums1[index]แทนที่ตำแหน่งind - คืนค่า
summ % (10^9 + 7)
ตัวอย่างโค้ด
def solve(nums1, nums2):
if nums1 == nums2:
return 0
minn_diff = float('-inf')
ind = -1
for i in range(len(nums1)):
if abs(nums1[i] - nums2[i]) > minn_diff:
ind = i
minn_diff = abs(nums1[i] - nums2[i])
diff = abs(nums1[ind] - nums2[ind])
index = ind
for i in range(len(nums1)):
if i != ind:
if abs(nums1[i] - nums2[ind]) < diff:
index = i
diff = abs(nums1[i] - nums2[ind])
summ = 0
for i in range(len(nums1)):
if i == ind:
summ += abs(nums1[index] - nums2[i])
else:
summ += abs(nums1[i] - nums2[i])
return summ % (10**9 + 7)
nums1 = [2,8,6]
nums2 = [3,4,6]
print(solve(nums1, nums2))
อินพุต
[2,8,6], [3,4,6]
เอาต์พุต
3