最小长度的子数组
最编程
2024-10-19 11:37:20
...
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
1.常规解法(会超时)
可以先将数组的所有子数组求出来,计算其中元素的值,判断与目标值的大小关系,代码如下:
public int minSubArrayLen(int target, int[] nums) {
int n = nums.length;
int len = n;
boolean flag = false;
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = i; j < n; j++) {
sum += nums[j];
if (sum >= target) {
flag = true;
len = Math.min(len, j - i + 1);
break;
}
}
}
return flag ? len : 0;
}
在上述代码中,使用了flag来判断是否有符合条件的子数组。
2.滑动窗口
使用该方法的前提是数组中的元素全是大于等于0的,可以使用单调性解题。
先定义两个指针left和right,这两个指针均指向第一个元素;
先让right向右移动,并用sum加上right指向的元素,当sum>=target时,可以求出符合条件的子数组的长度,这时可以让left向右移动,用sum减去left指向的元素,根据单调性,sum会越减越小,当sum<target时,left停止移动,继续上面的操作,当right指向数组外面时,最后的len就是结果。
流程图与代码如下:
public int minSubArrayLen(int target, int[] nums) {
int n = nums.length;
int len = Integer.MAX_VALUE;
int sum = 0;
for (int left = 0, right = 0; right < n; right++) {
sum += nums[right];
while (sum >= target) {
len = Math.min(len, right - left + 1);
sum -= nums[left++];
}
}
return len == Integer.MAX_VALUE ? 0 : len;
}
希望读者给出建议!
推荐阅读
-
最小长度的子数组
-
leetcode forcebutton brushup 系列 - [按位或最接近 K 的位置查找子数组] - 答案
-
立法会记录 1:查找旋转数组的最小值,确定旋转数组中是否存在给定元素 33. 查找旋转排序数组
-
LeetCode 1749.任意子数组之和的绝对值的最大值 - 输入: nums = [2,-5,1,-4,3,-2] 输出8 说明子数组 [-5,1,-4] 之和的最大绝对值为 abs(-5+1-4) = abs(-8) = 8。 小贴士
-
在C/C++中,如何轻松获取数组的长度?(使用宏和模板)
-
C语言:接收不确定长度的整数数组示例[C_001]
-
CryptoJS 加密报错 v-on 处理程序中的错误:"RangeError:无效数组长度
-
153. 寻找旋转排序数组中的最小值
-
[数组]-找出绝对值最小的有序数组(带负正)的个数-I。情景描述
-
[算法问题] 输入一个包含正数和负数的整数数组。数组中一个或多个连续的整数组成一个子数组。求所有子数组之和的最大值。所需的时间复杂度为 o(n)。