我可以搜索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}。
对于每个索引i
预先计算从0
到i
的子数组之和。然后要找到任何子数组(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)找到使和为零的元素组合(上面的程序只是发现它