当前位置: 首页 > 知识库问答 >
问题:

小于O(n2)的负数和正数的子数组和等于k

鄢翰藻
2023-03-14

我可以搜索eqaul到k之和的子数组中的正数,但下面的代码无法搜索数组中的负数。对于数组中的负数和正数,有没有找到给定和的子数组的算法?

public static void subarraySum(int[] arr, int sum) {

    int start=0;
    int currSum=arr[0];

    for(int i = 1;i<=arr.length;i++) {
        while(currSum>sum ) {
            currSum-=arr[start];
            start++;
        }
        if(currSum==sum) {
            System.out.println(start + " " + (i-1) + " index");
            start=i;
            currSum=0;
        }
        if(i<arr.length) {
            currSum +=arr[i];
        }

    }
}

例如,{10,2,-2,-20,10},在这个数组中查找sum为-10的子数组。子数组在这种情况下是{-20,10}。

共有1个答案

夏侯自珍
2023-03-14

对于每个索引i预先计算从0i的子数组之和。然后要找到任何子数组(i,j)的和,只需计算sum[j]-sum[i]+arr[i]

  public static void subArraySum(int[] arr, int target) {
    if (arr.length == 0) return;

    int n = arr.length;
    int[] sum = new int[n];
    sum[0] = arr[0];
    for (int i = 1; i < n; ++i) {
        sum[i] = sum[i - 1] + arr[i];
    }

    for (int i = 0; i < n; ++i)
      for (int j = i; j < n; ++j)
        if (sum[j] - sum[i] + arr[i] == target) {
            System.out.println(i + " " + j);
        }
  }

如果将总和存储在映射中,然后查询该映射以获得所需的总和,则可以更快地找到子数组。

 public static void subArraySum(int[] arr, int target) {
  if (arr.length == 0) return;

  int n = arr.length;
  int[] sum = new int[n];
  sum[0] = arr[0];
  for (int i = 1; i < n; ++i) {
      sum[i] = sum[i - 1] + arr[i];
  }

  Map<Integer, Integer> map = new TreeMap<>();
  for (int i = 0; i < n; ++i) {
      if (sum[i] == target) {
          System.out.println(0 + " " + i);
      }

      int requiredSum = sum[i] - target;
      if (map.containsKey(requiredSum)) {
          int startIndex = map.get(requiredSum) + 1;
          System.out.println(startIndex + " " + i);
      }
      map.put(sum[i], i);
  }
}

这个解决方案是O(N*logn),但是如果使用HashMap而不是TreeMap(O(N),如果您假设HashMap操作的复杂性是恒定的),则可以使其更快。

 类似资料:
  • 如何加快以下问题陈述的执行速度?我有一个正确的解决方案,通过每一个测试的小输入。但是,它超过了较大输入的时间限制。我当前的实现是数组大小的二次型。 你的答案应该是基于1的,这意味着数组的第一个位置是1而不是0。 实施

  • 我知道一个O(n2)soln,它能以更好的方式实现吗,因为数组中元素的数量限制非常大

  • 我有一个大小为的整数值数组和一个给定的。 我想找到子序列的总数,使得每个子序列的元素总和小于。例如:设 ,,数组的元素为 ,则其总子序列为 作为- 但是,所需的子序列是: 也就是说,不被取,因为它的元素和是,这大于,即

  • 这个问题有多项式解吗?如果有,你能呈现吗?

  • 我想找到给定正整数数组中元素的最大数目,使得它们的和小于或等于给定的k。例如,我有一个数组 答案是3,因为1,2,3是求和6的最大元素。

  • 如果有一个包含一组正数和负数的数组,请打印所有等于0的子集和。 我可以想出一种方法,在那里我可以制作givcen阵列的所有功率集,并检查它们的总和是否为0。但对我来说,这不像是优化的解决方案。 看完网上看起来有点类似的问题,好像可以用下面的程序动态编程来解决,看看是否有组合存在,让和11只是一个例子? 但是我不知道如何将上述程序扩展到 1)包括负数 2)找到使和为零的元素组合(上面的程序只是发现它