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

ตรวจสอบว่าเป็นไปได้หรือไม่ที่จะแบ่งพาร์ติชั่นใน k subarrays ด้วยผลรวมที่เท่ากันใน Python


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

ดังนั้น หากอินพุตเป็น nums =[2, 5, 3, 4, 7] k =3 ผลลัพธ์จะเป็น True เนื่องจากเราสามารถสร้างสามพาร์ติชั่นเช่น [(2, 5), (3, 4), (7)] ทั้งหมดมีค่าเท่ากับ 7.

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

  • n :=ขนาดของ nums
  • cumul_sum :=ผลรวมสะสมขององค์ประกอบทั้งหมดเป็น nums
  • total_sum :=cumul_sum[n - 1]
  • ถ้า Total_sum ไม่หารด้วย k แล้ว
    • คืนค่าเท็จ
  • นับ :=0, ตำแหน่ง :=-1
  • สำหรับฉันในช่วง 0 ถึง n - 1 ทำ
    • ถ้า pos เหมือนกับ -1 แล้ว
      • ย่อย :=0
    • มิฉะนั้น
      • sub :=cumul_sum[pos]
    • ถ้า cumul_sum[i] - ย่อยเหมือนกับ (total_sum / K) แล้ว
      • ตำแหน่ง :=ผม
      • นับ :=นับ + 1
    • มิฉะนั้น เมื่อ cumul_sum[i] - cumul_sum[pos]> (total_sum / K) แล้ว
      • ออกมาจากลูป
  • คืนค่า จริง เมื่อนับเหมือนกับ K มิฉะนั้น เท็จ

ตัวอย่าง

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

def solve(nums, k):
   n = len(nums)
   cumul_sum = [0 for i in range(n)]
   cumul_sum[0] = nums[0]
   for i in range(1, n):
      cumul_sum[i] = cumul_sum[i - 1] + nums[i]
   total_sum = cumul_sum[n - 1]
   if total_sum % k != 0:
      return False
   count = 0
   pos = -1
   for i in range(n):
      if pos == -1:
         sub = 0
      else:
         sub = cumul_sum[pos]
      if cumul_sum[i] - sub == total_sum / k:
         pos = i
         count += 1
      elif cumul_sum[i] - cumul_sum[pos] > total_sum / k:
         break
   return count == k
nums = [2, 5, 3, 4, 7]
k = 3
print(solve(nums, k))

อินพุต

[2, 5, 3, 4, 7], 3

ผลลัพธ์

True