Giả sử chúng ta có một danh sách các số được gọi là num và một giá trị khác k, chúng ta phải tìm k danh sách con có tổng lớn nhất và trả về các tổng theo thứ tự không giảm.
Vì vậy, nếu đầu vào là nums =[2, 4, 5, -100, 12, -30, 6, -2, 6] k =3, thì đầu ra sẽ là [10, 11, 12], như chúng ta có 3 danh sách con này với tổng lớn nhất - [6, -2, 6], [2, 4, 5], [12].
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- ps:=danh sách 1 + kích thước các số và điền bằng 0
- đối với mỗi chỉ số i và giá trị v nums, thực hiện
- ps [i + 1]:=v + ps [i]
- hp:=một danh sách mới
- đối với tôi trong phạm vi từ 0 đến kích thước của ps, thực hiện
- đối với j trong phạm vi i + 1 đến kích thước của ps, thực hiện
- chèn - (ps [j] - ps [i]) vào ps heap
- đối với j trong phạm vi i + 1 đến kích thước của ps, thực hiện
- res:=bật tất cả các phần tử trong ps heap và đảo ngược chúng
- trả lại res
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
from heapq import heappop, heappush class Solution: def solve(self, nums, k): ps = [0 for _ in range(len(nums) + 1)] for i, v in enumerate(nums): ps[i + 1] = v + ps[i] hp = [] for i in range(len(ps)): for j in range(i + 1, len(ps)): heappush(hp, -(ps[j] - ps[i])) return list(reversed([-heappop(hp) for _ in range(k)])) ob = Solution() nums = [2, 4, 5, -100, 12, -30, 6, -2, 6] k = 3 print(ob.solve(nums, k))
Đầu vào
[2, 4, 5, -100, 12, -30, 6, -2, 6],3
Đầu ra
[10, 11, 12]