题目描述
给你一个由若干 0 和 1 组成的数组 nums
以及整数 k
。如果所有 1 都至少相隔 k
个元素,则返回 True
;否则,返回 False
。
样例
输入:nums = [1,0,0,0,1,0,0,1], k = 2
输出:true
解释:每个 1 都至少相隔 2 个元素。
输入:nums = [1,0,0,1,0,1], k = 2
输出:false
解释:第二个 1 和第三个 1 之间只隔了 1 个元素。
输入:nums = [1,1,1,1,1], k = 0
输出:true
输入:nums = [0,1,0,1], k = 1
输出:true
限制
1 <= nums.length <= 10^5
0 <= k <= nums.length
nums[i]
的值为0
或1
算法
(线性遍历) $O(n)$
- 遍历数组,遍历过程中,记录上一次 1 的位置。
- 如果当前遇到了 1,只要不是第一次遇到 1 且与上一次遇到的距离小于等于
k
,则返回False
。 - 否则返回
True
。
时间复杂度
- 遍历一次数组,时间复杂度为 $O(n)$。
空间复杂度
- 仅需要常数的额外空间。
C++ 代码
class Solution {
public:
bool kLengthApart(vector<int>& nums, int k) {
int n = nums.size();
int last = -1;
for (int i = 0; i < n; i++)
if (nums[i] == 1) {
if (last != -1 && i - last <= k)
return false;
last = i;
}
return true;
}
};
大佬,编号乱了,这是1437题
已修正