Cho danh sách nums và số k. Mỗi phép toán cho phép thay đổi giá trị bất kỳ phần tử nào. Tìm độ dài dãy con liền kề dài nhất chứa toàn giá trị giống nhau sau tối đa k phép thay đổi.
Ví dụ: nums = [8, 6, 6, 4, 3, 6, 6], k = 2 → kết quả 6. Thay 4 và 3 thành 6 → [8, 6, 6, 6, 6, 6, 6], dãy con 6 liên tiếp dài 6.
Thuật toán giải quyết (Sliding Window / Cửa sổ trượt)
- Nếu
numsrỗng: trả về 0 - Dùng
defaultdict(int)đếm tần suất trong cửa sổ - Khởi tạo
max_count = 0,start = 0 - Duyệt
endtừ 0 đếnlen(nums)-1:- Tăng đếm
num_count[nums[end]] - Cập nhật
max_count = max(max_count, num_count[nums[end]]) - Nếu kích thước cửa sổ
end - start + 1 > max_count + k: thu hẹp cửa sổ từ trái (start++, giảm đếm)
- Tăng đếm
- Trả về
end - start + 1(kích thước cửa sổ cuối)
Ví dụ minh họa
from collections import defaultdict
def solve(nums, k):
if not nums:
return 0
num_count = defaultdict(int)
max_count = 0
start = 0
for end, num in enumerate(nums):
num_count[num] += 1
max_count = max(max_count, num_count[num])
if end - start + 1 > max_count + k:
num_count[nums[start]] -= 1
start += 1
return end - start + 1
nums = [8, 6, 6, 4, 3, 6, 6]
k = 2
print(solve(nums, k))
Đầu vào
[8, 6, 6, 4, 3, 6, 6], 2
Đầu ra
6