Cho danh sách chỉ chứa 0 và 1. Có thể xóa từ đầu hoặc cuối. Tìm số lần xóa tối thiểu sao cho danh sách còn lại có số lượng 0 và 1 bằng nhau.
Ví dụ: nums = [1, 1, 1, 0, 0, 1] → 2 (xóa 1 ở đầu và 1 ở cuối, còn 2 số 1 và 2 số 0).
Quy trình giải quyết (Prefix Sum + Hash Map)
- Biến đổi: 0 → -1, 1 → +1. Tìm dãy con liên tiếp dài nhất có tổng = 0.
- Duyệt mảng, tính
currSum(tiền tố). - Dùng từ điển
dlưu chỉ số đầu tiên xuất hiện của mỗicurrSum(khởi tạod[0] = -1). - Nếu
currSumđã có trongd, cập nhậtlongest = max(longest, i - d[currSum]). - Kết quả =
len(nums) - longest.
Ví dụ mã nguồn
class Solution:
def solve(self, nums):
longest = 0
d = {0: -1}
currSum = 0
for i in range(len(nums)):
if nums[i] == 0:
currSum -= 1
else:
currSum += 1
if currSum in d:
longest = max(longest, i - d[currSum])
else:
d[currSum] = i
return len(nums) - longest
ob = Solution()
nums = [1, 1, 1, 0, 0, 1]
print(ob.solve(nums)) # Output: 2
Đầu vào
[1, 1, 1, 0, 0, 1]
Đầu ra
2