力扣算法 1437题 是否所有1都至少相隔k个元素

力扣算法 1437题 是否所有1都至少相隔k个元素

题目:

给你一个由若干 01 组成的数组 nums 以及整数 k。如果所有 1 都至少相隔 k 个元素,则返回 true ;否则,返回 false

示例 1:

img

输入:nums = [1,0,0,0,1,0,0,1], k = 2
输出:true
解释:每个 1 都至少相隔 2 个元素。

示例 2:

img

输入:nums = [1,0,0,1,0,1], k = 2
输出:false
解释:第二个 1 和第三个 1 之间只隔了 1 个元素。

提示:

  • 1 <= nums.length <= 105
  • 0 <= k <= nums.length
  • nums[i] 的值为 01

解法1:标志法

解析:创建一个标志位,如果第一次碰到1,将其置为true,后面碰到0就临时temp变量+1,直到碰到下一个1

class Solution {
    public boolean kLengthApart(int[] nums, int k) {

        List<Integer> list = new ArrayList<>();
        boolean temp1 = false;
        int temp = 0;
        for ( int i = 0 ; i < nums.length ; i++){
            if (nums[i] == 1 && temp1 == false){
                temp1 = true;
            }else if (nums[i] == 1 && temp1 == true){
                list.add(temp);
                temp = 0;
            }else if( nums[i] == 0 && temp1 == true){
                temp +=1;
            }
        }
        for (Integer i : list){
            if(i < k){
                return false;
            }
        }
        return true;
    }
}

解法2:直接遍历

解析:直接遍历数组,只需要记录0的个数是否比k小,如果是,直接false

class Solution {
    public boolean kLengthApart(int[] nums, int k) {
        int zeroCount = k;
        for (int num: nums) {
            if (num == 0) {
                zeroCount++;
            } else if (num == 1) {
                if (zeroCount < k) {
                    return false;
                }
                zeroCount = 0;
            }
        }
        return true;
    }
}
posted @ 2025-11-20 09:37  戒爱学Java  阅读(0)  评论(0)    收藏  举报