题目:给定一个含有n个正整数的数组和一个正整数target。
找出该数组中满足其总和大于等于target的长度最小的连续字数组,并返回其长度。如果不存在符合条件的子数组,返回0。
思路:滑动窗口(一般用在数组和字符串上)
- 滑动:窗口可以按照一定的方向移动
- 窗口:窗口大小可以固定,也可以不固定,此时可以向外或者向内,扩容或者缩小窗口直至满足条件
步骤:
- 使用左右指针left和right,left与right之间的长度就是窗口的大小(即连续数组的大小)
- 如果滑动窗口内的值sum>=target,维护连续数组的最短长度,left向右移动,缩短滑动窗口
- 如果滑动窗口的值 sum<target right向右移动
方法一:
代码如下:
时间复杂度(O(n))
public class test1 {
public int minSubArrayLen(int s,int[] nums){
int left=0;
int sum=0;
int result=Integer.MIN_VALUE;
for (int right=0;right<nums.length;right++){
sum+=nums[right];
if (sum >= s) {
result=Math.min(result,right-left+1);
sum-=nums[left++];
}
}
return result == Integer.MIN_VALUE ? 0 :result;
}
}
方法二:
思路:遍历数组
一开始两个元素元素遍历之后三个三个元素遍历 直至遍历长度为n 找到最短的数组长度
#include<stdio.h>
int main() {
int n = 6; //数组长度
int lng = 6; //匹配数组长度
int target = 4; //目标匹配值
int nums[6] = {2, 3, 1, 2, 4, 3};
int prel, preh;
int head = 0; //头指针
int low; //尾指针
for (low = 1; low <= n - 1;) {
int j = low;
head = 0;
while (j <= n - 1) {
int sum = 0;
int i;
for (i = head; i <= j; i++) {
sum += nums[i];
if (sum == target) {
if (lng > (j - head)) {
preh = head;
prel = j;
lng = j - head;
}
}
};
head++;
j++;
}
low++;
}
for (int k = 0; k < n; k++) {
if (nums[k] == target) {
lng = 0;
preh=0;
prel=0;
}
}
// return lng;
printf("%d", lng + 1);
printf("%d", preh);
printf("%d", prel);
}