Hai danh sách nums1, nums2 biểu diễn vector dạng mã hóa độ dài chạy (run-length encoding). Ví dụ: [1,1,1,2,2,2,2] → [3,1,4,2] (3 số 1, 4 số 2). Tính tích vô hướng của hai vector này.
Ví dụ: nums1=[2,7,5,3], nums2=[3,5,4,2] → 109 (vector: [7,7,3,3,3,3,3]·[5,5,5,2,2,2,2]).
Giải thuật (Xử lý từ cuối mảng)
- Lấy cặp
(val, count)từ cuối mỗi mảng - Cộng dồn
(val1 * val2) * min(count1, count2)vào kết quả - Phần dư của count lớn hơn đẩy ngược vào mảng tương ứng
- Lặp cho đến khi một mảng rỗng
Ví dụ triển khai
def solve(nums1, nums2):
ans = 0
while nums1 and nums2:
val1 = nums1.pop()
count1 = nums1.pop()
val2 = nums2.pop()
count2 = nums2.pop()
ans += (val1 * val2) * min(count2, count1)
if count2 > count1:
nums2.append(abs(count2 - count1))
nums2.append(val2)
elif count1 > count2:
nums1.append(abs(count2 - count1))
nums1.append(val1)
return ans
nums1 = [2, 7, 5, 3]
nums2 = [3, 5, 4, 2]
print(solve(nums1, nums2))
Đầu vào
[2, 7, 5, 3], [3, 5, 4, 2]
Đầu ra
109