5401.是否所有1都至少相隔k个元素

image-20200503175036891

解题

思路

  • 这道题想复杂了,实质就是遍历找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;
    }
原文地址:https://www.cnblogs.com/yh-simon/p/12822820.html