cpp
class Solution {
public:
bool kLengthApart(vector<int>& nums, int k) {
// cnt:记录当前位置与上一个1之间的"间隔元素数"
// 初始化为k:处理第一个1的情况(第一个1前面没有元素,默认满足间隔要求)
int cnt = k;
// 遍历数组的每个元素
for (int num : nums) {
if (num == 0) {
// 当前是0,间隔数+1
cnt++;
continue; // 跳过后续逻辑,继续下一个元素
}
// 当前是1:检查与上一个1的间隔是否≥k
if (cnt < k) {
return false; // 间隔不足,直接返回false
}
// 重置间隔数:当前1是新的"上一个1",后续元素从0开始计数间隔
cnt = 0;
}
// 遍历完所有元素,所有1的间隔都满足要求
return true;
}
};
为什么初始化为 k?
假设 cnt 初始化为 0,会出现什么问题?
当第一个元素是 1 时,代码会检查 cnt < k(即 0 < k)。如果 k ≥ 1,会直接返回 false,这显然错误(第一个 1 不需要间隔)。
而初始化为 k 时:
当第一个元素是 1 时,代码检查 cnt < k(即 k < k),结果为 false,不会误判,而是正常重置 cnt=0,开始统计与下一个 1 的间隔。
即使 k=0(允许 1 相邻),初始化为 0 也满足 cnt >= 0,逻辑依然正确。