Cho mảng nhị phân nums và số nguyên k. Kiểm tra xem mọi cặp số 1 có cách nhau ít nhất k vị trí (tức là số 0 giữa chúng ≥ k).
Ví dụ
Đầu vào: nums = [1,0,0,0,1,0,0,1], k = 2
Đầu ra: true (khoảng cách: 3, 2 đều ≥ 2).
Thuật toán duyệt một lần
- Biến
last = -1lưu vị trí số 1 gần nhất. - Duyệt mảng: nếu
nums[i] == 1:- Nếu
last != -1vài - last - 1 < k→ trả về false. - Cập nhật
last = i.
- Nếu
- Kết thúc duyệt → trả về true.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool kLengthApart(vector<int>& nums, int k) {
int last = -1;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] == 1) {
if (last != -1 && i - last - 1 < k) return false;
last = i;
}
}
return true;
}
};
Độ phức tạp
- Thời gian: O(N) - duyệt mảng một lần.
- Không gian: O(1).
Kết quả kiểm thử
Đầu vào: {1,0,0,0,1,0,0,1}, 2
Đầu ra: 1 (true)