5401.是否所有1都至少相隔k个元素
解题
思路
- 这道题想复杂了,实质就是遍历找1,像[1,0,0,0]这种类型的,一脸懵,所以理解题意很重要,还有需要注意提示的信息。
- 最后虽然通过,但写得太。。。啰嗦了
代码
/*
*缺陷太大
*18ms
*/
public boolean kLengthApart(int[] nums, int k) {
int len = nums.length;
int count = 0;
int min = 0;
int c1 = 0;
List<Integer> list = new ArrayList<>();
count = nums[0] == 1 ? 0 : 1;
for (int i = 1; i < len; i++) {
if (nums[i] == 0) {
count += 1;
} else {
c1++;
list.add(count);
count = 0;
}
}
if ((nums[0] == 1 && c1 == 1)) {
return true;
}
if (c1 == 0) {
return true;
}
Collections.sort(list);
min = list.get(0);
return min == k;
}
优解
思路
- 使用双指针pre 、next 分别记录 “1” 的 一前一后 的索引
- 将初始pre=-100000,因为第一个1的左边没有0,并不需要判断间距,但根据代码逻辑,会计算间距,只要保证计算出的间距大于等于k即可。而k的最大值为100000,将pre=-100000,next=0就能保证。
- 只要这个间距小于k,即不满足要求,就return false;
- 数组中只有一个1或没有1,不会进入if循环(当时纠结这个问题)
代码
/**
* 1 <= nums.length <= 10^5
* 0 <= k <= nums.length
* nums[i] 的值为 0 或 1
*
* 1ms
*/
public boolean kLennugthApart2(int[] nums,int k){
int len=nums.length;
for(int pre=-100000,next=0;next<len;next++){
if(nums[next]==1){
if(next-pre-1<k){
return false;
}
pre=next;
}
}
return true;
}