การนับคู่ดัชนี (i, j) ที่ผลรวมเป็น 2^k
กำหนดให้ i < j หาจำนวนคู่ที่ nums[i] + nums[j] = 2^k สำหรับ k >= 0
อัลกอริทึม
- ใช้ Counter นับความถี่ของตัวเลขที่ผ่านมาแล้ว
- วนลูปแต่ละตัวเลข x ใน nums
- สำหรับ k = 0 ถึง 31 (ครอบคลุมช่วง int 32-bit) ตรวจสอบว่า (2^k - x) เคยเจอมาก่อนหรือไม่
- เพิ่มจำนวนคู่ที่พบ
- อัปเดตความถี่ของ x
ตัวอย่างโค้ด
from collections import Counter
def solve(nums):
res, c = 0, Counter()
for x in nums:
for j in range(32):
res += c[(1 << j) - x]
c[x] += 1
return res
nums = [1, 2, 6, 3, 5]
print(solve(nums))
ผลลัพธ์
3
คำอธิบายคู่ที่พบ
- (6, 2) → 8 = 2^3
- (5, 3) → 8 = 2^3
- (1, 3) → 4 = 2^2
ความซับซ้อน
Time: O(n * 32) ≈ O(n), Space: O(n)