gpt4 book ai didi

javascript - 如何在时间复杂度为 Big O(N) 的循环内对数组部分求和

转载 作者:行者123 更新时间:2023-12-03 02:23:28 24 4
gpt4 key购买 nike

我有一个函数,它根据数组分区的位置 P 返回数组两部分之和之间的最小差异。尽管预期是 O(N),但测试程序的运行时间复杂度为 O(N * N),性能为 0%。

问题:我可以改变其中的任何方面来提高性能吗?有没有更好的方法在不使用子循环的情况下对循环内的数组求和?谢谢

任何整数 P,使得 0 < P < N,将该磁带分割成两个非空部分: A[0]、A[1]、...、A[P − 1] 和 A[P]、A[P + 1]、...、A[N − 1]。

两部分之间的差异是以下值: |(A[0] + A[1] + ... + A[P − 1]) − (A[P] + A[P + 1] + ... + A[N − 1])|

https://jsbin.com/mehisi/edit

function solution(A) {

'use strict';

if(arguments.length === 1 && typeof A === "object" && A.length > 1 ){
try{
const N = A.length;

let diff;
for( let P =1 ; P < N ; P++) {
// For each value of P, calc the difference
//|(A[0] + A[1] + ... + A[P − 1]) − (A[P] + A[P + 1] + ... + A[N − 1])|

// use slice to prevent modification of oraginal copy
var A2 = A.slice(0) ;
//splice array into two A1 and A2
let A1 = A2.splice(0, P); // All Element from start up to P
console.log("From Array " + A + " Remove "+ A1 + " Remaining " + A2);
// reduce((a, b) => a + b, 0);
let diffp = Math.abs((A1.reduce(function(a, b) { return a + b; }, 0)) -
(A2.reduce(function(a, b) { return a + b; }, 0))) ;

if(diff > diffp || diff === undefined ){
diff = diffp ;
}
console.log(P + "Difference ="+ diff + " Instead of " + diffp + " \r\n " );
}

// Return the Minimum value of P
return diff ;
}
catch(err){
console.log("Error: " + err );
return 0 ; // undefined ;
}
}else{
console.log("Invalid parameter(s)");
return 0 ; // undefined ;
}

}

var A = [] ;
A[0] = 5
A[1] = 1
A[2] = 2
A[3] = 7
A[4] = 4
console.log(solution(A)) ;

最佳答案

是的,在线性时间(甚至恒定空间)内通过运行总和来完成此操作非常简单。

function solution(arr) {
var leftSum = 0; // sum from 0 to P
var rightSum = arr.reduce((a, b) => a + b, 0); // sum from P to N
var min = Math.abs(leftSum - rightSum); // initial value for p=0
for (var p = 0; p < arr.length; p++)
// move the element from the right to the left side
leftSum += arr[p];
rightSum -= arr[p];
// then update minimum difference
min = Math.min(min, Math.abs(leftSum - rightSum));
}
return min;
}

关于javascript - 如何在时间复杂度为 Big O(N) 的循环内对数组部分求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com