题目是LeetCode第187场周赛的第二题,链接:是否所有 1 都至少相隔 k 个元素。具体描述为:给你一个由若干 0 和 1 组成的数组 nums 以及整数 k。如果所有 1 都至少相隔 k 个元素,则返回 True ;否则,返回 False 。
示例1:
输入:nums = [1,0,0,0,1,0,0,1], k = 2
输出:true
解释:每个 1 都至少相隔 2 个元素。
示例2:
输入:nums = [1,0,0,1,0,1], k = 2
输出:false
解释:第二个 1 和第三个 1 之间只隔了 1 个元素。
示例3:
输入:nums = [1,1,1,1,1], k = 0
输出:true
示例4:
输入:nums = [0,1,0,1], k = 1
输出:true
虽然是medium难度的但还是很简单,直接遍历一遍,判断前后两个1之间的距离是否满足即可。时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
JAVA版代码如下:
class Solution {
public boolean kLengthApart(int[] nums, int k) {
int prev = -1, i;
for (i = 0; i < nums.length; ++i) {
if (nums[i] == 1) {
prev = i;
break;
}
}
for (++i; i < nums.length; ++i) {
if (nums[i] == 1) {
if (i - prev <= k) {
return false;
}
prev = i;
}
}
return true;
}
}
提交结果如下:
Python版代码如下:
class Solution:
def kLengthApart(self, nums: List[int], k: int) -> bool:
N = len(nums)
prev = -1
i = 0
while i < N:
if nums[i] == 1:
prev = i
break
i += 1
while i < N - 1:
i += 1
if nums[i] == 1:
if i - prev <= k:
return False
prev = i
return True
提交结果如下: