给定长度为N的数组。您将如何找到最小长度
连续的子数组,其和为S,乘积为P.
例如5 6 1 4 6 2 9 7
for S = 17, Ans = [6, 2, 9]
for P = 24, Ans = [4 6]
。
答案 0 :(得分:6)
只是从左到右,并将所有数字相加,如果总和> S,然后丢掉左边的。
import java.util.Arrays;
public class test {
public static void main (String[] args) {
int[] array = {5, 6, 1, 4, 6, 2, 9, 7};
int length = array.length;
int S = 17;
int sum = 0; // current sum of sub array, assume all positive
int start = 0; // current start of sub array
int minLength = array.length + 1; // length of minimum sub array found
int minStart = 0; // start of of minimum sub array found
for (int index = 0; index < length; index++) {
sum = sum + array[index];
// Find by add to right
if (sum == S && index - start + 1 < minLength) {
minLength = index - start + 1;
minStart = start;
}
while (sum >= S) {
sum = sum - array[start];
start++;
// Find by minus from left
if (sum == S && index - start + 1 < minLength) {
minLength = index - start + 1;
minStart = start;
}
}
}
// Found
if (minLength != length + 1) {
System.out.println(Arrays.toString(Arrays.copyOfRange(array, minStart, minStart + minLength)));
}
}
}
对于您的示例,我认为它是 OR 。
除了计算之外,产品与 sum 没什么区别。
答案 1 :(得分:1)
伪代码:
subStart = 0;
Sum = 0
for (i = 0; i< array.Length; i++)
Sum = Sum + array[i];
if (Sum < targetSum) continue;
if (Sum == targetSum) result = min(result, i - subStart +1);
while (Sum >= targetSum)
Sum = Sum - array[subStart];
subStart++;
我认为通过一次通过数组会找到结果。 result
值中缺少一些细节。如果需要,那里需要更复杂的能够返回实际的子阵列。
要找到Product子阵列,只需在上述算法中用乘法/除法代替加法/减法
答案 2 :(得分:1)
在数组上放两个索引。让我们称他们为i和j。最初j = 1且i = 0。如果i和j之间的乘积小于P,则增加j。如果它大于P,则递增i。如果我们得到等于p的东西,总结元素(而不是每次总结,维持一个数组,其中S(i)是它左边的所有东西的总和。计算从i到j的和作为S(i) - S(j))并看看当j落在数组长度之外时是否得到S.停止。
这是O(n)。
答案 3 :(得分:0)
您可以使用散列图在O(N)时间内找到具有额外空间的产品答案。