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

โปรแกรมค้นหาจำนวนการดำเนินการที่จำเป็นในการสร้างคู่จากด้านแรกและด้านสุดท้ายมีผลรวมเท่ากันในPython


สมมติว่าเรามีรายการหมายเลขที่เรียกว่า nums ความยาวของรายการนี้เท่ากัน ตอนนี้ให้พิจารณาการดำเนินการที่เราเลือกตัวเลขใดๆ ใน nums และอัปเดตด้วยค่าในช่วง [1 และสูงสุด nums] เราต้องหาจำนวนขั้นต่ำของการดำเนินการดังกล่าวที่จำเป็นสำหรับทุกๆ i nums[i] + nums[n-1-i] เท่ากับจำนวนเดียวกัน

ดังนั้น หากอินพุตเท่ากับ nums =[8,6,2,5,9,2] ผลลัพธ์จะเป็น 2 เพราะหากเราเปลี่ยน 2 ตัวแรกที่ nums[2] เป็น 5 และ 9 ที่ nums[4 ] ถึง 4 จากนั้นองค์ประกอบจะเป็น [8,6,5,5,4,2] จากนั้น nums[i] + nums[n-1-i] สำหรับแต่ละ i จะเป็น (8+2) =( 6+4) =(5+5) =10.

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • N :=ขนาดของ nums
  • mx :=สูงสุดของ nums
  • เหตุการณ์ :=รายการใหม่
  • idx :=0
  • ในขณะที่ idx <ชั้นของ N / 2 ทำ
    • a :=nums[idx]
    • b :=nums[N - idx - 1]
    • แทรกคู่ (ขั้นต่ำ (a + 1), (b + 1), 1) ที่ส่วนท้ายของกิจกรรม
    • ใส่คู่ (a + b, 1) ที่ส่วนท้ายของกิจกรรม
    • แทรกคู่ (a + b + 1, -1) ที่ส่วนท้ายของกิจกรรม
    • ใส่คู่ (สูงสุด (a + mx) และ (b + mx + 1), -1) ที่ส่วนท้ายของเหตุการณ์
    • idx :=idx + 1
  • จัดเรียงรายการกิจกรรม
  • ปัจจุบัน :=0
  • mx_same :=0
  • สำหรับแต่ละคู่ (เหตุการณ์ เดลต้า) ในเหตุการณ์ ทำ
    • ปัจจุบัน :=ปัจจุบัน + เดลต้า
    • mx_same :=สูงสุดของกระแสและ mx_same
  • ส่งคืน N - mx_same

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

def solve(nums):
   N = len(nums)
   mx = max(nums)
   events = []

   idx = 0
   while idx < N // 2:
      a = nums[idx]
      b = nums[N - idx - 1]

      events.append((min(a + 1, b + 1), 1))
      events.append((a + b, 1))
      events.append((a + b + 1, -1))
      events.append((max(a + mx, b + mx) + 1, -1))

   idx += 1

   events.sort()
   current = 0
   mx_same = 0

   for event, delta in events:
      current += delta
      mx_same = max(current, mx_same)

   return N - mx_same

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

อินพุต

[6, 8, 5, 2, 3]

ผลลัพธ์

2