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

โปรแกรมค้นหาการแลกเปลี่ยนขั้นต่ำที่อยู่ติดกันสำหรับ K ที่ต่อเนื่องกันใน Python


สมมติว่าเรามีเลขฐานสองเลขฐานสองและค่า k ในการย้ายครั้งเดียว เราสามารถเลือกสองดัชนีที่อยู่ติดกันและสลับค่าของดัชนีได้ เราต้องหาจำนวนการเคลื่อนไหวขั้นต่ำที่จำเป็นเพื่อให้ nums มี k ติดต่อกันเป็น 1

ดังนั้น หากอินพุตเท่ากับ nums =[1,0,0,1,0,1,0,1], k =3 ผลลัพธ์จะเป็น 2 เพราะในการแลกเปลี่ยนครั้งเดียว เราสามารถสร้างอาร์เรย์จาก [1,0 ได้ ,0,1,0,1,0,1] ถึง [1,0,0,0,1,1,0,1] จากนั้น [1,0,0,0,1,1,1,1,0] .

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

  • เจ :=0

  • ค่า :=0

  • ตอบ :=999999

  • loc :=รายการใหม่

  • สำหรับแต่ละดัชนี i และค่า x เป็น nums ทำ

    • ถ้า x ไม่ใช่ศูนย์ แล้ว

      • ใส่ i ต่อท้าย loc

      • m :=ผลหารของ (j + ขนาดของ loc - 1) /2

      • val :=val + loc[-1] - loc[m] - ผลหารของ (ขนาดของ loc -j)/2

      • ถ้าความยาวของ loc - j> k แล้ว

        • m :=ผลหารของ (j + ขนาดของ loc) /2

        • val :=val - loc[m] - loc[j] - ผลหารของ (ขนาดของ loc -j)/2

        • เจ :=เจ + 1

      • ถ้าขนาดของ loc -j เท่ากับ k แล้ว

        • ans :=ขั้นต่ำของ ans และ val

  • กลับมาอีกครั้ง

ตัวอย่าง

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

def solve(nums, k):
   j = val = 0
   ans = 999999
   loc = []
   for i, x in enumerate(nums):
      if x:
         loc.append(i)
         m = (j + len(loc) - 1)//2
         val += loc[-1] - loc[m] - (len(loc)-j)//2
         if len(loc) - j > k:
            m = (j + len(loc))//2
            val -= loc[m] - loc[j] - (len(loc)-j)//2
            j += 1
         if len(loc)-j == k:
            ans = min(ans, val)
   return ans

nums = [1,0,0,1,0,1,0,1]
k = 3
print(solve(nums, k))

อินพุต

[1,0,0,1,0,1,0,1], 3

ผลลัพธ์

2