【发布时间】:2020-09-18 19:15:51
【问题描述】:
我有一个数字数组,现在我想找到所有连续的子数组和,其值与小于或等于 k 匹配。我想返回最大的子数组大小。
这是我的程序:
public static int process(List<Integer> arr, int k) {
int size = 0;
for (int i = 0; i < arr.size(); i++) {
int sum = 0;
for (int j = i; j < arr.size(); j++) {
sum += arr.get(j);
if (sum <= k) {
size = Math.max(size, j - i + 1);
}
}
}
return size;
}
约束:
arr size is between 1 to 100000
array elements are between 1 to 100
k is between 1 to 1000000
说明:
Arrays.asList(2, 3, 5, 1, 1, 2, 1), 7
arr = 2, 3, 5, 1, 1, 2, 1
k= 7
可能的子数组:
[2], [3], [5], [1], [1], [2], [1]
[2,3], [5,1], [1,1], [1,2], [2,1]
[5,1,1], [1,1,2], [1,2,1]
[1,1,2,1]
Maximum sub array is [1,1,2,1] = its length is 4. So program should return 4.
我上周在竞争性考试中得到了这个任务,当我使用这段代码时,它只通过了 50% 的测试用例。一些隐藏的测试用例输出错误,一些测试用例超时。
我的代码有什么问题?
更新: 稍微修改了我的代码。并添加了一个示例。
【问题讨论】:
-
你能解释一下你的问题和想要的输出吗
-
当没有子数组添加到
k时你应该返回0吗? -
@Hades,对不起,我错过了添加它们,让我再次修改问题
-
超时的原因是你的算法是O(n^2)。只要总和大于
k,就可以通过打破内部循环来加快速度。使用滑动窗口可以大大加快速度。 -
可能你的问题是当
sum > k时你继续前进。或者,至少是其中的一部分。您应该只从i向前看,直到那里的累积总和超过您的目标总和。