生成给定总和和乘积的子数组

时间:2011-04-04 05:57:06

标签: algorithm

给定长度为N的数组。您将如何找到最小长度 连续的子数组,其和为S,乘积为P. 例如5 6 1 4 6 2 9 7 for S = 17, Ans = [6, 2, 9] for P = 24, Ans = [4 6]

4 个答案:

答案 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)时间内找到具有额外空间的产品答案。