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

โปรแกรมค้นหาความยาวของรายการย่อยที่เล็กที่สุดที่สามารถลบเพื่อให้ผลรวมหารด้วย k ในPython


สมมติว่าเรามีรายการที่มีค่าบวกเรียกว่า nums และยังมีจำนวนบวก k ด้วย เราต้องหาความยาวของรายการย่อยที่สั้นที่สุด (อาจว่างเปล่า) ที่เราลบออกจาก nums ได้ ดังนั้นผลรวมขององค์ประกอบที่เหลือหารด้วย k ลงตัว แต่เราไม่สามารถลบรายการทั้งหมดได้ หากไม่มีรายการย่อยที่จะลบ ให้คืนค่า -1

ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[5,8,6,3] k =8 ผลลัพธ์จะเป็น 1 เนื่องจากผลรวมปัจจุบันขององค์ประกอบของ [5,8,6,3] เท่ากับ 22 ถ้าเรา ลบรายการย่อย [6] ของความยาว 1 แล้วผลรวมคือ 16 ซึ่งหารด้วย 8 ลงตัว

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

  • rem :=(ผลรวมขององค์ประกอบทั้งหมดที่มีอยู่ใน nums + k) mod k
  • ถ้า rem เหมือนกับ 0 แล้ว
    • คืน 0
  • n :=ขนาดของ nums
  • สันนิษฐาน :=0
  • mp :=พจนานุกรม เริ่มต้นเก็บ -1 สำหรับคีย์ 0
  • res :=n
  • สำหรับฉันในช่วง 0 ถึง n - 1 ทำ
    • สันนิษฐาน :=presum + nums[i]
    • m :=(presum + k) mod k
    • mp[m] :=ฉัน
    • ถ้า (m - rem + k) mod k มีอยู่ใน mp แล้ว
      • res :=ขั้นต่ำของ res และ (i - mp[(m - rem + k) mod k])
  • คืนค่า res หาก res ไม่เหมือนกับ n มิฉะนั้น -1

ตัวอย่าง

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

def solve(nums, k):
   rem = (sum(nums) + k) % k
   if rem == 0:
      return 0
   n, presum = len(nums), 0
   mp = {0: -1}
   res = n
   for i in range(n):
      presum += nums[i]
      m = (presum + k) % k
      mp[m] = i
      if (m - rem + k) % k in mp:
         res = min(res, i - mp[(m - rem + k) % k])
   return res if res != n else -1

nums = [5,8,6,3]
k = 8
print(solve(nums, k))

อินพุต

[5,8,6,3], 8

ผลลัพธ์

1