มื้ออาหารที่ดีประกอบด้วยอาหารสองอย่างที่แตกต่างกัน โดยมีผลรวมของความอร่อยเท่ากับยกกำลังสอง คุณสามารถเลือกอาหารสองอย่างที่แตกต่างกันเพื่อทำอาหารที่ดีได้
สมมติว่าเราได้ให้อาร์เรย์ของจำนวนเต็ม 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