题目描述是这样的:
给定一个包含n个正整数的数组和一个正整数s,找出其满足和sum ≥ s的子数组的最小长度。如果不存在这样的子数组,返回0
例如,给定数组 [2,3,1,2,4,3]与s = 7,
子数组[4,3]具有满足题设条件的最小长度。
按照直觉的办法, 需要n平方的复杂度, 但是既然是子串, 那就是要找到连续的字符串. 这种问题用二分法解决的话, 应该可以控制在nlogn的复杂度.
下面附上我的C 代码, 用直觉的方法计算的. nlogn 的代码等我先想到算法再附上:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int calSum (int i, int j, int* a)
{
int sum = 0;
int t = 0;
for (t = i; t <= j; t++)
{
sum += a[t];
}
return sum;
}
int calMinLen(int i, int j, int s, int* a)
{
int sum = calSum(i, j, a);
while (sum >= s)
{
j--;
sum = calSum(i, j, a);
}
j++;
return j-i+1;
}
int main(int argc, char* args[])
{
int i = 0, j = argc-3, l = 0, minl = argc-2;
int s = atoi(args[1]);
int a[argc-2];
for (i = 0; i < argc-2; i++)
{
a[i] = atoi(args[i+2]);
}
for (i = 0; i < j; i++)
{
l = calMinLen(i, j, s, a);
if (minl > l) minl = l;
}
printf("minl is %d\n", minl);
return 0;
}