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

โปรแกรมหาความกว้าง ramp สูงสุดใน Python


สมมติว่าเรามีอาร์เรย์ nums ramp คือคู่ (i, j) ที่ i < j และ nums[i] <= nums[j] ความกว้างของ ramp คือ (j-i) เราต้องหาความกว้างสูงสุดของ ramp ใน nums ถ้าไม่พบ return 0

เช่น ถ้าอินพุตคือ nums = [6,0,8,2,1,5] ผลลัพธ์จะเป็น 4 เพราะ ramp ความกว้างสูงสุดอยู่ที่ (i, j) = (1, 5) และ nums[1] = 0 และ nums[5] = 5

วิธีแก้ปัญหา

  • B := แมปใหม่
  • สำหรับ i ในช่วง 0 ถึงขนาดของ nums:
    • x := nums[i]
    • ถ้า x อยู่ใน B: เพิ่ม i ลงท้าย B[x]
    • มิฉะนั้น: B[x] := [i]
  • mini := รายการเริ่มต้นเก็บ inf หนึ่งค่า
  • maxi := รายการเริ่มต้นเก็บ -inf หนึ่งค่า
  • สำหรับแต่ละ x ในรายการคีย์ของ B ที่เรียงแล้ว:
    • เพิ่ม min(ค่าสุดท้ายของ mini, min ของ B[x]) ลงท้าย mini
  • สำหรับแต่ละ x ในรายการคีย์ของ B ที่เรียงย้อนกลับ:
    • เพิ่ม max(ค่าสุดท้ายของ maxi, max ของ B[x]) ลงท้าย maxi
  • maxi := ย้อนกลับ maxi แล้ว取สไลซ์จากต้นถึงตัวก่อนหน้าสุดท้าย
  • mini := สไลซ์ของ mini[จากดัชนี 1 ถึงสุด]
  • p := 0, res := -inf
  • while p < ขนาดของ mini:
    • res := max(res, maxi[p] - mini[p])
    • p := p + 1
  • return res

ตัวอย่าง

def solve(nums):
    B = {}
    for i in range(len(nums)):
        x = nums[i]
        if x in B:
            B[x].append(i)
        else:
            B[x] = [i]
    mini = [float('inf')]
    maxi = [float('-inf')]
    for x in sorted(B.keys()):
        mini.append(min(mini[-1], min(B[x])))
    for x in sorted(B.keys(), reverse=True):
        maxi.append(max(maxi[-1], max(B[x])))
    maxi = maxi[::-1][:-1]
    mini = mini[1:]
    p = 0
    res = float('-inf')
    while p < len(mini):
        res = max(res, maxi[p] - mini[p])
        p += 1
    return res

nums = [6,0,8,2,1,5]
print(solve(nums))

อินพุต

[6,0,8,2,1,5]

เอาต์พุต

4