📜  二进制数组中 1 的最小长度子数组(1)

📅  最后修改于: 2023-12-03 15:36:04.115000             🧑  作者: Mango

二进制数组中 1 的最小长度子数组

题目描述:

给定一个只包含 0 和 1 的二进制数组,找出其中最小的包含全部 1 的子数组的长度。

示例:

输入: [1,0,1,1,0,1]
输出: 3
解释: 最小的包含全部1的子数组是 [1,1,1]。

这道题可以使用滑动窗口的思想,维护一个滑动窗口,窗口的右端点+1,直到窗口中包含了全部的 1,然后缩小左端点,直到窗口不再包含全部的 1,记录当前子数组的长度,不断更新最小长度即可。

以下是Java的代码实现:

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int left = 0, right = -1; // 初始窗口大小为0
        int sum = 0; // 当前窗口中的元素和
        int minLen = Integer.MAX_VALUE; // 初始化最小长度为最大值
        while (left < nums.length) {
            if (right + 1 < nums.length && sum < s) { // 如果右端点不越界且窗口中元素和小于s,则右移右端点
                sum += nums[++right];
            } else { // 否则,左移左端点
                sum -= nums[left++];
            }
            if (sum >= s) { // 如果当前窗口中的元素和大于等于s,则记录此时的子数组长度,并更新最小长度
                minLen = Math.min(minLen, right - left + 1);
            }
        }
        return minLen == Integer.MAX_VALUE ? 0 : minLen; // 如果没有符合条件的子数组,则返回0,否则返回最小长度
    }
}

时间复杂度是 $O(n)$,其中 $n$ 是数组的长度。