📅  最后修改于: 2023-12-03 15:36:04.115000             🧑  作者: Mango
题目描述:
给定一个只包含 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$ 是数组的长度。