Codewars Kata的问题-数组增加中的最大差异

时间:2019-11-26 14:20:05

标签: javascript

我正在尝试在Codewars上解决此问题:https://www.codewars.com/kata/largest-difference-in-increasing-indexes/train/javascript

  

考虑第一个数组中的所有数字对   小于或等于第二个。

     

从这些中找到一对,它们在数组中的位置是   相距最远。

     

返回两个数组元素的索引之间的差   这对。

这就是我所拥有的,无法弄清为什么它是不正确的。

var largestDifference = function(data) {
    arr = [];
    for (var i = 0; i < data.length-1; i++) {
        for (var j = data.length-1; j>i;  j--) {
            if (data[i] <= data[j]) {
                arr.push(i)
            }
        }
    }
    ans = Math.max(...arr)- Math.min(...arr);
    return ans 
};

3 个答案:

答案 0 :(得分:1)

您无需将i推送到ans数组。您需要推动ji之差,即j - i

var largestDifference = function(data) {
  let res = [];
  for(let i = 0; i < data.length; i++){
    for(let j = i + 1; j < data.length; j++){
      if(data[i] <= data[j]){
        res.push(j - i);
      }
    }
  }
  return res.length ? Math.max(...res) : 0
};
console.log(largestDifference([9,4,1,10,3,4,0,-1,-2])) // 4
console.log(largestDifference([3, 2, 1])) // 0

答案 1 :(得分:1)

您不需要收集增量。

  

相反,如果找到最大值,则可以直接取最大值,并使用该值来防止循环出现不能提供更大最大值的项目。

        |               |
indices | 0   1   2   3 | 4   5   6   7   8
        |     *         |     *              result
values  | 9   4   1  10 | 3   4   0  -1  -2  max
        | *           + | -   -   -   -   -   3
        |     *         |     +   -   -   -   4
        |         *     |             -   -
        |             * |                 -
---------------------------------------------------- never visited
        |               | *   +   -   -   -
        |               |     *   -   -   -
        |               |         *   -   -          * data[i]
        |               |             *   -          - data[j]
        | indices for i |                            + data[j] match

var largestDifference = function (data) {
        var i, j, l = data.length - 1, max = 0;
        for (i = 0; i + max < l; i++) {
            for (j = l; i + max < j; j--) {
                if (data[i] <= data[j] && max < j - i) {
                    max = j - i;
                    break;
                }
            }
        }
        return max;
    };

console.log(largestDifference([9, 4, 1, 10, 3, 4, 0, -1, -2]));
console.log(largestDifference([3, 2, 1]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

你快到了;您需要推动索引之间的差异 j - i ,然后取所有差异的Max()。或者,如果没有,则返回0。

var largestDifference = function(data) {
  arr = [];
  for (var i = 0; i < data.length - 1; i++) {
    for (var j = data.length - 1; j > i; j--) {
      if (data[i] <= data[j]) {
        arr.push(j - i)
      }
    }
  }
  return arr.length > 0 ? Math.max(...arr) : 0;
};

console.log(largestDifference([9, 4, 1, 10, 3, 4, 0, -1, -2]));
// 4 because data[1] <= data[5], so 5 - 1 = 4

console.log(largestDifference([3, 2, 1]));
// 0 because not found

console.log(largestDifference([1, 2, 3]));
// 2, because here j = 2 and i = 0 and 2 - 0 = 2

也可以在没有辅助数组或Max()的情况下更简单(更有效):

var largestDifference = function(data) {
  let result = 0;
  for (var i = 0; i < data.length - 1; i++) {
    for (var j = data.length - 1; j > i; j--) {
      if (data[i] <= data[j] && result < j - i) {
        result = j - i;
      }
    }
  }
  return result;
};

console.log(largestDifference([9, 4, 1, 10, 3, 4, 0, -1, -2]));
console.log(largestDifference([3, 2, 1]));
console.log(largestDifference([1, 2, 3]));