Giả sử chúng ta có một số mảng nhị phân và một giá trị k. Trong một lần di chuyển, chúng ta có thể chọn hai chỉ số liền kề và hoán đổi giá trị của chúng. Chúng ta phải tìm số lần di chuyển tối thiểu cần thiết để số có k số 1 liên tiếp.
Vì vậy, nếu đầu vào giống như nums =[1,0,0,1,0,1,0,1], k =3, thì đầu ra sẽ là 2 vì trong một lần hoán đổi, chúng ta có thể tạo mảng từ [1,0 , 0,1,0,1,0,1] đến [1,0,0,0,1,1,0,1], sau đó [1,0,0,0,1,1,1,0] .
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
j:=0
-
val:=0
-
ans:=999999
-
loc:=a new list
-
đối với mỗi chỉ số i và giá trị x tính bằng số, thực hiện
-
nếu x khác 0 thì
-
chèn tôi vào cuối loc
-
m:=thương số của (j + kích thước của loc - 1) / 2
-
val:=val + loc [-1] - loc [m] - thương số của (kích thước của loc -j) / 2
-
nếu độ dài của loc - j> k, thì
-
m:=thương số của (j + kích thước của loc) / 2
-
val:=val - loc [m] - loc [j] - thương số của (kích thước của loc -j) / 2
-
j:=j + 1
-
-
nếu kích thước của loc -j bằng k thì
-
ans:=tối thiểu ans và val
-
-
-
-
trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn
def solve(nums, k): j = val = 0 ans = 999999 loc = [] for i, x in enumerate(nums): if x: loc.append(i) m = (j + len(loc) - 1)//2 val += loc[-1] - loc[m] - (len(loc)-j)//2 if len(loc) - j > k: m = (j + len(loc))//2 val -= loc[m] - loc[j] - (len(loc)-j)//2 j += 1 if len(loc)-j == k: ans = min(ans, val) return ans nums = [1,0,0,1,0,1,0,1] k = 3 print(solve(nums, k))
Đầu vào
[1,0,0,1,0,1,0,1], 3
Đầu ra
2