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

โปรแกรมหา Index ของค่าสูงสุดใน Concealed Array ด้วย Compare Subarray (Python)

โจทย์

มีคลาส TestArray ที่มี Private Array และ Methods:

  • length() - คืนความยาว
  • compare(l, r, x, y) - เปรียบเทียบผลรวม Subarray [l..r] กับ [x..y] คืน 1, 0, -1

ต้องหา Index ของค่าสูงสุดในอาร์เรย์โดยใช้เฉพาะ Methods นี้

ตัวอย่าง: array = [8, 4, 2, 12, 11, 8, 4, 2, 7] → Output: 3 (ค่า 12 อยู่ Index 3)

อัลกอริธึม (Binary Search แบบปรับ)

  1. ใช้ Binary Search บนช่วง [low, high]
  2. คำนวณ mid แบบพิเศษ: (low+high+1)//2
  3. เปรียบเทียบครึ่งซ้ายและขวาโดยใช้ compare()
  4. ปรับ low/high ตามผลลัพธ์ จน low == high

โค้ด Python

class TestArray:
    def __init__(self, array) -> None:
        self.__arr = array
    def length(self):
        return len(self.__arr)
    def compare(self, l, r, x, y):
        val1 = sum(self.__arr[l:r+1])
        val2 = sum(self.__arr[x:y+1])
        if val1 > val2: return 1
        elif val1 == val2: return 0
        else: return -1

def solve(reader):
    n = reader.length()
    low, high = 0, n - 1
    while low < high:
        mid = (low + high + 1) // 2
        if (low + high + 1) % 2 == 0:
            res = reader.compare(low, mid-1, mid, high)
            if res == 1: high = mid - 1
            else: low = mid
        else:
            res = reader.compare(low, mid-1, mid+1, high)
            if res == 1: high = mid - 1
            elif res == -1: low = mid + 1
            else: return mid
        if high == low: return high
    return -1

arr_ob = TestArray([8, 4, 2, 12, 11, 8, 4, 2, 7])
print(solve(arr_ob))  # Output: 3

Input / Output

Input:  [8, 4, 2, 12, 11, 8, 4, 2, 7]
Output: 3