Mô tả bài toán
Cho danh sách nums và số k. Mỗi phép toán tăng một phần tử lên 1. Thực hiện tối đa k phép. Tìm giá trị xuất hiện nhiều nhất có thể đạt được. Nếu có nhiều giải pháp, chọn số nhỏ nhất.
Ví dụ: nums = [1, 0, 0, 0, 8, 8, 8, 8], k = 8 → đầu ra 8 (tăng 1 lên 8 tốn 7, tăng một 0 lên 1 tốn 1, còn lại 0, được 5 số 8).
Giải thuật (Cửa sổ trượt trên mảng đã sắp xếp)
- Sắp xếp
nums. - Khởi tạo
low = 0,high = 0,dist = 0,best = 0,ret = -1. - Khi
high < len(nums):- Nếu
high > 0vànums[high] != nums[high-1]:dist += (high - low) * (nums[high] - nums[high-1]). high += 1.- Khi
dist > k:dist -= nums[high-1] - nums[low],low += 1. - Nếu
high - low > best:best = high - low,ret = nums[high-1].
- Nếu
- Trả về
ret.
Ví dụ mã Python
class Solution:
def solve(self, nums, k):
nums.sort()
low, high = 0, 0
dist = 0
best = 0
ret = -1
while high < len(nums):
if high > 0 and nums[high] != nums[high - 1]:
dist += (high - low) * (nums[high] - nums[high - 1])
high += 1
while dist > k:
dist -= nums[high - 1] - nums[low]
low += 1
if high - low > best:
best = high - low
ret = nums[high - 1]
return ret
ob = Solution()
nums = [1, 0, 0, 0, 8, 8, 8, 8]
k = 8
print(ob.solve(nums, k))
Đầu vào
[1, 0, 0, 0, 8, 8, 8, 8], 8
Đầu ra
8