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

โปรแกรมค้นหากลุ่มขนาด M ล่าสุดโดยใช้ Python


สมมติว่าเรามีอาร์เรย์ arr ซึ่งเป็นการเรียงสับเปลี่ยนของตัวเลขตั้งแต่ 1 ถึง n ถ้าเรามีสตริงไบนารีขนาด n และเริ่มต้นบิตทั้งหมดเป็นศูนย์ ตอนนี้ในแต่ละขั้นตอน i (การจัดทำดัชนีเริ่มจาก 1 สำหรับทั้งสตริงไบนารีและ arr) จาก 1 ถึง n บิตที่ตำแหน่ง arr[i] ถูกตั้งค่าเป็น 1 เรายังมีอีกค่าหนึ่งคือ m และเราจำเป็นต้องค้นหาค่าล่าสุด ขั้นตอนที่มีกลุ่มคนขนาด m. ในที่นี้ กลุ่มของ one หมายถึงสตริงย่อยที่ต่อเนื่องกันของ 1s ซึ่งไม่สามารถขยายไปในทิศทางใดทิศทางหนึ่งได้ เราต้องหาขั้นตอนล่าสุดที่มีกลุ่มของความยาวพอดี m. หากไม่พบกลุ่มดังกล่าว ให้คืนค่า -1

ดังนั้น หากอินพุตเป็นเหมือน arr =[3,5,1,2,4] m =3 เอาต์พุตจะเป็น 4 เพราะสตริงไบนารีเริ่มต้นคือ "00000" จากนั้นทำตามขั้นตอน -

  • "00100", กลุ่ม:["1"]

  • "00101", กลุ่ม:["1", "1"]

  • "10101", กลุ่ม:["1", "1", "1"]

  • "11101", กลุ่ม:["111", "1"]

  • "11111", กลุ่ม:["11111"]

ขั้นตอนล่าสุดที่มีกลุ่มขนาด 3 คือขั้นตอนที่ 4

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

  • n :=ขนาดของ arr

  • num :=0

  • ตอบ :=-1

  • l :=อาร์เรย์ขนาด n และเติม 0

  • r :=อาร์เรย์ขนาด n และเติม 0

  • สำหรับฉันอยู่ในช่วง 0 ถึง n - 1 ทำ

    • คู :=1

    • idx :=arr[i] - 1

    • ถ้า r[idx] เหมือนกับ m แล้ว

      • num :=num - 1

    • ถ้า l[idx] เหมือนกับ m แล้ว

      • num :=num - 1

    • cur :=cur + l[idx] + r[idx]

    • num :=num + cur เหมือนกับ m

    • ถ้า num> 0 แล้ว

      • ans :=สูงสุดของ ans, i + 1

    • ถ้า idx - l[idx]> 0 แล้ว

      • r[idx - l[idx] - 1] :=cur

    • ถ้า idx + r[idx]

      • l[idx + r[idx] + 1] :=cur

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

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

ตัวอย่าง

def solve(arr, m):
   n = len(arr)
   num = 0
   ans = -1
   l = [0] * n
   r = [0] * n
   for i in range(n):
      cur = 1
      idx = arr[i] - 1
      if r[idx] == m:
         num -= 1
      if l[idx] == m:
         num -= 1
      cur += l[idx] + r[idx]
      num += cur == m
      if num > 0:
         ans = max(ans, i + 1)
      if idx - l[idx] > 0:
         r[idx - l[idx] - 1] = cur
      if idx + r[idx] < n - 1:
         l[idx + r[idx] + 1] = cur
   return ans
arr = [3,5,1,2,4]
m = 3
print(solve(arr, m))

อินพุต

[3,5,1,2,4], 3

ผลลัพธ์

4