Codility Flags几乎是完美的,无法理解哪种边缘情况是失败的原因

时间:2015-12-28 16:58:01

标签: javascript algorithm

您可以在此处查看任务文字:https://codility.com/programmers/lessons/8/

这是我的解决方案:

// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');

function solution(A) {
var length = A.length,
peaksIndex = [];
for (var i=1;i<length-1;i++){
    if (A[i] > A[i-1] && A[i] > A[i+1]){
        peaksIndex.push(i);
    }
}
var peaksLength = peaksIndex.length;
var maxPeaksLength = Math.min(Math.ceil(Math.sqrt(length)), peaksLength);
var maxFound = 0;
for (var j=maxPeaksLength;j>0;j--){
    //debugger;
    // j is the max number of flags AND distance
    var found = 0;
    var distance = 0;
    for (var k=peaksLength-1;k>=0;k--){
        var prevPeak;
        if (k===0){
            prevPeak = -j;
        } else {
            prevPeak = peaksIndex[k-1];
        }
        distance += peaksIndex[k]-prevPeak;
        if (distance >=j){
            distance = 0;
            found++;
        }
    }
    if (found > maxFound) {
        maxFound = found;
    }
    if (maxFound >= j-1){
        break;
    }
}
return maxFound;
// write your code in JavaScript (Node.js 4.0.0)
}

或在Codility:https://codility.com/demo/results/trainingQJNNVS-U3Y/

正如你在那里看到的那样,唯一不正确的情况是

  

large_anti_slow
  大试慢慢   解决方案WRONG ANSWER得到317,预计为316

     
      
  1. 0.298 s确定

  2.   
  3. 0.216 s WRONG ANSWER,预计317预计316

  4.   

简而言之,我不明白我的算法中有什么问题,只有在这种情况下才会失败?

1 个答案:

答案 0 :(得分:0)

k上的迭代次序看起来有点奇怪。从循环的内容看起来你想从k == 0开始,但循环实际上是按降序排列。

如果你改变它可能会更好:

for (var k=peaksLength-1;k>=0;k--){

for (var k=0;k<=peaksLength-1;k++){