สมมติว่าเรามีอาร์เรย์ชื่อ nums และอีกค่าหนึ่ง k ในหนึ่งการดำเนินการ เราสามารถเลือกสององค์ประกอบจาก nums ที่ผลรวมเท่ากับ k และลบพวกมันออกจากอาร์เรย์ เราต้องหาจำนวนการดำเนินการสูงสุดที่เราสามารถทำได้บนอาร์เรย์
เช่น ถ้าอินพุตคือ nums = [8,3,6,1,5] k = 9 ผลลัพธ์จะเป็น 2 เพราะเราสามารถลบ [3,6] ที่ผลรวม 9 แล้วลบ [8,1] ที่ผลรวมก็ 9
วิธีแก้ปัญหา
- counter := แมปเก็บความถี่ของแต่ละ item ใน nums
- res := 0
- สำหรับแต่ละ num ใน counter:
- ถ้า counter[k-num] ไม่เป็นศูนย์:
- ถ้า num ไม่เท่ากับ k - num:
- res := res + min(counter[num], counter[k-num])
- counter[k-num] := 0
- counter[num] := 0
- มิฉะนั้น:
- res := res + ผลหารของ (counter[num] / 2)
- ถ้า num ไม่เท่ากับ k - num:
- ถ้า counter[k-num] ไม่เป็นศูนย์:
- return res
ตัวอย่าง
from collections import Counter
def solve(nums, k):
counter = Counter(nums)
res = 0
for num in counter:
if counter.get(k-num, 0):
if num != k - num:
res += min(counter[num], counter[k-num])
counter[k-num] = 0
counter[num] = 0
else:
res += int(counter[num] / 2)
return res
nums = [8,3,6,1,5]
k = 9
print(solve(nums, k))
อินพุต
[8,3,6,1,5], 9
เอาต์พุต
2