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)
添加回答
舉報