Giả sử chúng ta có một danh sách chứa các số 0 và 1, chúng ta phải xóa các giá trị ở phía trước hoặc phía sau của danh sách. Cuối cùng, chúng ta phải tìm số lần xóa tối thiểu cần thiết để danh sách còn lại có số lượng 0 và 1 bằng nhau.
Vì vậy, nếu đầu vào giống như nums =[1, 1, 1, 0, 0, 1], thì đầu ra sẽ là 2, vì chúng ta có thể xóa đầu vào 1 và cuối cùng là 1 để có hai số 1 và hai số 0 .
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- dài nhất:=0
- d:=một bản đồ trong đó đặt giá trị -1 cho khóa 0
- currSum:=0
- đối với tôi trong phạm vi từ 0 đến kích thước là num, hãy thực hiện
- nếu nums [i] giống 0, thì
- currSum:=currSum - 1
- nếu không,
- currSum:=currSum + 1
- nếu currSum bằng d, thì
- dài nhất:=tối đa là dài nhất và i - d [currSum]
- nếu không,
- d [currSum]:=i
- nếu nums [i] giống 0, thì
- trả về kích thước nums - dài nhất
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
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))
Đầu vào
[1, 1, 1, 0, 0, 1]
Đầu ra
2