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

ค้นหาจำนวนอาร์เรย์ย่อยในการเรียงสับเปลี่ยนของจำนวนธรรมชาติ N ตัวแรก โดยที่ค่ามัธยฐานของพวกมันคือ M ใน Python


สมมติว่าเรามีอาร์เรย์ A ที่มีการเรียงสับเปลี่ยนของตัวเลขธรรมชาติ N ตัวแรกและให้หมายเลข M อีกตัวหนึ่ง โดยที่ M ≤ N เราต้องหาจำนวนอาร์เรย์ย่อยที่ ค่ามัธยฐานของลำดับคือ M ดังที่เราทราบค่ามัธยฐานของลำดับถูกกำหนดให้เป็นค่าขององค์ประกอบที่อยู่ตรงกลางของลำดับหลังจากจัดเรียงตามลำดับจากน้อยไปมาก สำหรับลำดับที่มีความยาวเท่ากัน จะใช้ด้านซ้ายขององค์ประกอบตรงกลางสองส่วน

ดังนั้น หากอินพุตเป็น A =[3, 5, 6, 4, 2] และ M =5 เอาต์พุตจะเป็น 4 เนื่องจากอาร์เรย์ย่อยที่ต้องการคือ [3, 5, 6], [5], [5 , 6] และ [5, 6, 4].

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

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

  • my_map :=แผนที่ใหม่

  • my_map[0] :=1

  • มี :=เท็จ เพิ่ม :=0, ผลลัพธ์ :=0

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

    • ถ้า arr[i]

      • เพิ่ม :=เพิ่ม - 1

    • มิฉะนั้นเมื่อ arr[i]> m แล้ว

      • เพิ่ม :=เพิ่ม + 1

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

      • มี :=จริง

    • ถ้ามีจริงแล้ว

      • ถ้าเพิ่ม present ใน my_map แล้ว

        • ผลลัพธ์ :=ผล + my_map[เพิ่ม]

      • ถ้า add-1 มีอยู่ใน my_map แล้ว

        • ผลลัพธ์ :=ผล + my_map[เพิ่ม - 1]

    • มิฉะนั้น

      • my_map[เพิ่ม] :=(ค่าของ my_map[เพิ่ม] หากมี มิฉะนั้น 0) + 1

  • ส่งคืนผลลัพธ์

ตัวอย่าง

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

def solve(arr, m):
   n = len(arr)
   my_map = {}
   my_map[0] = 1
   has = False
   add = 0
   result = 0
   for i in range(n):
      if (arr[i] < m):
         add -= 1
      elif (arr[i] > m):
         add += 1
      if (arr[i] == m):
         has = True
      if (has):
         if(add in my_map):
            result += my_map[add]
         if add-1 in my_map:
            result += my_map[add - 1]
      else:
         my_map[add] = my_map.get(add, 0) + 1
   return result
arr = [3, 5, 6, 4, 2]
m = 5
print(solve(arr, m))

อินพุต

[3, 5, 6, 4, 2] , 5

ผลลัพธ์

3