2 回答
TA贡献1810条经验 获得超4个赞
以下方法可能有助于提高复杂性:
我首先会计算元素的累积和,即对于上面的示例,如下所示:
int[] A = {3,1,2,4,3};
for(int i = 1; i< A.length; i++){
A[i] = A[i-1]+A[i];
}
生产:
[3, 4, 6, 10, 13]
[A.length-1]并在第二个循环中计算每个索引处的每个子和与总和的绝对差i
|A[i] - (A[A.length-1] + A[i])|
你的方法可能类似于:
public static int solution(int[] A){
for(int i = 1; i< A.length; i++){
A[i] = A[i-1]+A[i];
}
System.out.println(Arrays.toString(A));
int min = Integer.MAX_VALUE;
for(int i = 0; i< A.length-1; i++){
if(Math.abs(A[i]-A[A.length-1]+A[i]) < min){
min = Math.abs(A[i]-A[A.length-1]+A[i]);
}
}
return min;
}
您还可以使用内置方法Arrays.parallelPrefix(int[] array, IntBinaryOperator op)来累积数组的元素并摆脱第一个循环。来自javadoc
使用提供的函数并行累积给定数组的每个元素。例如,如果数组最初包含 [2, 1, 0, 3] 并且操作执行加法,则返回时数组包含 [2, 3, 3, 6]。对于大型数组,并行前缀计算通常比顺序循环更有效。
代码使用Arrays.parallelPrefix
public static int solution(int[] A){
Arrays.parallelPrefix(A, Integer::sum);
System.out.println(Arrays.toString(A));
int min = Integer.MAX_VALUE;
for(int i = 0; i< A.length-1; i++){
if(Math.abs(A[i]-A[A.length-1]+A[i]) < min){
min = Math.abs(A[i]-A[A.length-1]+A[i]);
}
}
return min;
}
TA贡献1843条经验 获得超7个赞
利用前缀和的概念可以降低时间复杂度。
使用 2 个前缀和数组:
1)forward_prefix_sum(从左到右数组元素的总和)
2)backward_prefix_sum(从右到左数组元素的总和)。
最后遍历数组计算差值最小。
answer = min(abs(forward_prefix_sum[i] - backward_prefix_sum[i]))
对于 (0 <= i < n)
Time complexity: O(n)
添加回答
举报