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

นับอาหารที่ดีใน Python


มื้ออาหารที่ดีประกอบด้วยอาหารสองอย่างที่แตกต่างกัน โดยมีผลรวมของความอร่อยเท่ากับยกกำลังสอง คุณสามารถเลือกอาหารสองอย่างที่แตกต่างกันเพื่อทำอาหารที่ดีได้

สมมติว่าเราได้ให้อาร์เรย์ของจำนวนเต็ม arr โดยที่ arr[i] คือความอร่อยของรายการอาหาร คืนค่าจำนวนมื้ออาหารดีๆ ต่างๆ ที่คุณสามารถทำได้จากรายการนี้

ตัวอย่างเช่น

อินพุต-1

arr[ ] = {1, 3, 5, 7, 9}

ผลผลิต

4

คำอธิบาย − อาหารที่ดีได้แก่ (1,3) (1,7) (3,5) และ (7,9) ผลรวมตามลำดับคือ 4, 8, 8 และ 16 ซึ่งทั้งหมดยกกำลัง 2

อินพุต-2

arr[ ]= {1,1,1,3,3,3,7}

ผลผลิต

15

คำอธิบาย − อาหารที่ดีคือ (1,1) ใน 3 วิธี (1,3) ใน 9 วิธีและ (1,7) ใน 3 วิธี

แนวทางที่ใช้ในการแก้ปัญหานี้

  • รับอินพุตเป็นอาร์เรย์ของจำนวนเต็มบวก

  • คู่ฟังก์ชันนับรวมองค์ประกอบอาร์เรย์ทั้งหมดเป็นรายการของจำนวนเต็ม

  • จัดเรียงองค์ประกอบอาร์เรย์อินพุตตามลำดับที่เพิ่มขึ้น

  • สำหรับทุกองค์ประกอบของอาร์เรย์ ให้หาผลรวมสูงสุดที่ทุกองค์ประกอบอยู่ในกำลังของ '2'

ตัวอย่าง

class Solution:
   def countpairs(self, arr: List[int]) -> int:
      """
         elem1 + elem2 == 1 << i
         elem1 = 2 << i - elem2
      """
      result = 0
      seen = defaultdict(int)
      arr.sort()
      for d in arr:
         n = 1
         while n <= d + d:
            ans = (ans + seen[n-d]) % (10 ** 9 + 7)
            n = n << 1
         seen[d] += 1
      return ans
sol1= Solution()
print(sol1.countpairs([1,1,1,3,3,3,7]))

ผลลัพธ์

4