![](/img/trans.png)
[英]How to find two number whose sum is given number in sorted array in O(n)?
[英]How to find continuous sub-array whose sum is equal to a particular number in O(n) time complexity
我已经解决了同样的问题,但我的代码的时间复杂度是 O(n^2)。 这是我运行两个循环的代码,因此我的时间复杂度变为 O(n^2)。 有什么办法可以更改我的代码以便在 O(n) 时间内解决相同的问题?
import java.util.Arrays;
public class PracticeOne {
public static void checkSum(int[] arr, int N) {
int sum = 0;
for(int i = 0; i < arr.length; i++) {
sum = 0;
for(int j = i; j < arr.length; j++) {
sum += arr[j];
if(sum == N) {
System.out.println(Arrays.toString(Arrays.copyOfRange(arr, i, j+1)));
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {5, 4, 1, 2, 3, 4, 1, 4, 5, 5};
int N = 10;
checkSum(arr, N);
}
}
您基本上需要 2 个指针索引,开始和结束。 如果总和太高移动开始索引,移动结束索引总和太低。
我没有对其进行太多测试,但这是基本思想:
public static void checkSum(int[] arr, int N) { // O(n)
int sum = 0;
int startPoint = 0;
for(int endPoint = 0; endPoint < arr.length; endPoint++) {
sum += arr[endPoint];
while(sum > N) {
sum -= arr[startPoint++];
}
if(sum == N) {
System.out.println(Arrays.toString(Arrays.copyOfRange(arr, startPoint, endPoint+1)));
}
}
有什么办法可以更改我的代码以便在 O(n) 时间内解决相同的问题?
是的,但前提是你保证数组中的所有值都是正数或 0。你遍历你的数组,并每次检查总和(在添加下一个元素之后)。 如果您高于 N,则删除最旧的值,直到您再次等于或低于 N。 你重复这个,直到你点击 N 或数组的末尾:
public static void checkSum(int[] arr, int N) {
if (N == 0) {
System.out.println("[]");
}
int sum = 0;
LinkedList<Integer> elements = new LinkedList<>();
for (int value : arr) {
sum += value;
elements.addLast(value);
while (sum > N && !elements.isEmpty()) {
Integer oldest = elements.pollFirst();
sum -= oldest;
}
if (sum == N) {
System.out.println(elements);
}
}
}
这最多只会访问每个号码两次,因为您只会添加一次,删除一次。
结果:
[5, 4, 1]
[4, 1, 2, 3]
[1, 2, 3, 4]
[2, 3, 4, 1]
[1, 4, 5]
[5, 5]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.