我刚接受了Codility磁带均衡测试here
从你的分数中我可以看出,我对这个功能的执行速度不够好。任何人都可以给我一些指示,以便我可以优化此代码并接近100%?
这是代码......
function solution(A) {
var minimumAbsDiff = null;
for(var currentIndex =1;currentIndex < A.length;currentIndex ++){
var bottomHalf = getTotal(0,currentIndex-1,A);
var topHalf = getTotal(currentIndex,A.length-1,A);
var absDiff = Math.abs(bottomHalf - topHalf);
if(minimumAbsDiff == null){
minimumAbsDiff = absDiff;
}else{
if(absDiff < minimumAbsDiff) minimumAbsDiff = absDiff;
}
}
return minimumAbsDiff;
}
function getTotal(start,end,arrayTocheck){
var total = 0;
for(var currentIndex = start;currentIndex <= end;currentIndex++){
total = total + arrayTocheck[currentIndex];
}
return total;
}
答案 0 :(得分:4)
您不想优化速度。您想要降低algorithmic complexity。您当前的算法为O(n²)
,而目标说明明确指出
- 预期最坏情况时间复杂度为O(N);
- 预期的最坏情况空间复杂度为O(N),超出输入存储 (不计算输入参数所需的存储空间)。
那么有什么可以做到的?对于P
,每个总差异距离其他差异很小。如果您将|(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|
和P
的值P+1
进行比较,则只会有一定量的工作差异。
function solution(A) {
var left = 0,
right = A.reduce(function(a, b) { return a + b; }, 0);
var min = Infinity;
for (var p = 0; p<A.length-1; p++) {
left += A[p];
right -= A[p];
min = Math.min(min, Math.abs(left - right));
}
return min;
}
答案 1 :(得分:0)
///这是快速版本4中的解决方案,具有完美的100%任务分数,正确性和性能。您也可以很容易地以O(N)的复杂性来理解它。
public func solution(_ A : inout [Int]) -> Int {
var sumR = 0
for i in 1..<A.count {
sumR += A[i]
}
var sumL = A[0]
var min = abs(sumL - sumR)
for i in 1..<(A.count-1) {
sumL += A[i]
sumR -= A[i]
var diff = abs(sumL-sumR)
if min > diff {
min = diff
}
}
return min
}