Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

หาความต่าง Min-Max ของ Triplet จาก 3 อาร์เรย์ที่เรียงแล้วใน Python

Minimize max(A[i],B[j],C[k]) - min(A[i],B[j],C[k]) จาก 3 อาร์เรย์เรียงลำดับ

กำหนดอาร์เรย์ 3 ตัว A, B, C ที่เรียงจากน้อยไปมาก (ขนาดอาจต่างกัน) ต้องหา Triplet (a,b,c) ที่ทำให้ max(a,b,c) - min(a,b,c) น้อยที่สุด

ตัวอย่าง: A=[2,5,6,9,11], B=[7,10,16], C=[3,4,7,7] → เลือก 6,7,7 → ความต่าง = 1

อัลกอริทึม Three Pointers (O(N))

  1. เริ่มต้น pointer ทั้งสามที่ตำแหน่งสุดท้าย (ค่ามากสุด)
  2. คำนวณ diff = max - min อัปเดตค่าน้อยสุด
  3. ลด pointer ที่อยู่ที่ค่า max ลง 1 (เพราะลดค่ามากสุดอาจลดช่องว่างได้)
  4. ทำซ้ำจน pointer ใดถึง -1

โค้ดตัวอย่าง Python

def solve(A, B, C):
    i, j, k = len(A)-1, len(B)-1, len(C)-1
    min_diff = abs(max(A[i], B[j], C[k]) - min(A[i], B[j], C[k]))
    while i >= 0 and j >= 0 and k >= 0:
        cur_max = max(A[i], B[j], C[k])
        cur_min = min(A[i], B[j], C[k])
        min_diff = min(min_diff, cur_max - cur_min)
        if A[i] == cur_max:
            i -= 1
        elif B[j] == cur_max:
            j -= 1
        else:
            k -= 1
    return min_diff

A = [2, 5, 6, 9, 11]
B = [7, 10, 16]
C = [3, 4, 7, 7]
print(solve(A, B, C))  # 1