Giả sử chúng ta có một mảng A. Đây là mảng chỉ chứa các số 0 và 1, ở đây một phép lật K-bit bao gồm việc chọn một mảng con (liền kề) có độ dài K và đảo ngược đồng thời các bit n của mảng con. Chúng ta phải tìm số lần lật K-bit tối thiểu cần thiết để không có số 0 trong mảng. Nếu không có khả năng như vậy, hãy trả về -1.
Vì vậy, nếu đầu vào là [0,0,0,1,0,1,1,0] và K =3, thì đầu ra sẽ là 3, vì chúng ta cần thực hiện các phép toán ba lần, trong lần thử đầu tiên lật A [0] thành A [3], mảng sẽ là [1,1,1,1,0,1,1,0], trong lần chạy thứ hai, lật A [4] thành A [6], mảng sẽ là [1,1,1,1,1,0,0,0] và trong lần di chuyển thứ 3 thay đổi A [5] thành A [7], mảng sẽ là [1,1,1,1,1 , 1,1,1].
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
n:=kích thước của A
-
Xác định di chuyển mảng có kích thước n
-
bộ đếm:=0
-
để khởi tạo i:=0, khi i + K <=n, cập nhật (tăng i lên 1), thực hiện -
-
nếu tôi> 0, thì -
-
di chuyển [i]:=di chuyển [i] + di chuyển [i - 1]
-
-
nếu không ((move [i] mod 2) + A [i]) mod 2 khác 0, thì -
-
di chuyển [i]:=di chuyển [i] + 1
-
nếu i + K
-
di chuyển [i + K] - =1
-
-
(tăng bộ đếm lên 1)
-
-
-
cho tôi
-
nếu tôi> 0, thì -
-
di chuyển [i]:=di chuyển [i] + di chuyển [i - 1]
-
-
nếu không ((move [i] mod 2) + A [i]) mod 2 khác 0, thì -
-
trả về -1
-
-
-
quầy trả hàng
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Đầu ra
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minKBitFlips(vector<int>& A, int K){
int n = A.size();
vector<int> moves(n);
int i;
int counter = 0;
for (i = 0; i + K <= n; i++) {
if (i > 0)
moves[i] += moves[i - 1];
if (!(((moves[i] % 2) + A[i]) % 2)) {
moves[i] += 1;
if (i + K < n)
moves[i + K] -= 1;
counter++;
}
}
for (; i < n; i++) {
if (i > 0)
moves[i] += moves[i - 1];
if (!(((moves[i] % 2) + A[i]) % 2))
return -1;
}
return counter;
}
};
main(){
Solution ob;
vector<int> v = {0,0,0,1,0,1,1,0};
cout << (ob.minKBitFlips(v, 3));
} Đầu vào
{0,0,0,1,0,1,1,0}, 3 Đầu ra
3