JS HackerRank Jesse和Cookies-堆问题超时

时间:2018-12-17 01:29:20

标签: javascript heap

嗨,我有以下代码来解决Hackerrank问题:Jesse和Cookies。我花了三个多小时来研究这个问题,但找不到JavaScript解决方案或此问题的提示。我的代码似乎可以正常工作,只是它在大型数组(输入大小> 1百万)中超时。

有没有一种方法可以使我的代码更高效(我认为时间复杂度在线性和n log n之间)。

您可以尝试使用此输入(在第一行中,右边的是'k',所有从第2行开始的行都是数组的一部分): https://hr-testcases-us-east-1.s3.amazonaws.com/16183/input20.txt?AWSAccessKeyId=AKIAJ4WZFDFQTZRGO3QA&Expires=1545016628&Signature=8DuPZfIaF4fPzhKSSatLFTy7B0A%3D&response-content-type=text%2Fplain

问题链接: https://www.hackerrank.com/challenges/jesse-and-cookies/problem

我的代码:

function cookies(k, A) {
  A.sort((a,b)=>a-b)
  let ops = 0;
  while (A[0] < k && A.length > 1) {
    ops++;
    let calc = (A[0] * 1) + (A[1] * 2);
    A.splice(0, 2);
    let inserted = false
    if (A.length === 0) { // when the array is empty after splice
      A.push(calc);
    } else {
      for (var i = 0; i < A.length && !inserted; i++) {
        if (A[A.length - 1] < calc) {
          A.push(calc)
          inserted = true
        } else if (A[i] >= calc) {
          A.splice(i, 0, calc);
          inserted = true
        }
      }
    }
  }
  if (A[0] < k) {
    ops = -1;
  }
  return ops;
}

1 个答案:

答案 0 :(得分:0)

我使用Java解决了它。您可能会适应Javascript。

此代码不需要使用堆。它只能在传递的同一数组上工作。通过了我的所有测试。

static int cookies(int k, int[] arr) {
    /*
     * Write your code here.
     */
    Arrays.sort(arr);
    int i = 0,
        c = arr.length,
        i0 = 0,
        c0 = 0,
        op = 0;
    while( (arr[i]<k || arr[i0]<k) && (c0-i0 + c-i)>1 ) {
        int s1 = i0==c0 || arr[i]<=arr[i0] ? arr[i++] : arr[i0++], 
            s2 = i0==c0 || (i!=c && arr[i]<=arr[i0]) ? arr[i++] : arr[i0++];
        arr[c0++] = s1 + 2*s2;
        op++;
        if( i==c ) {
            i = i0;
            c = c0;
            c0 = i0;
        }
    }

    return c-i>1 || arr[i]>=k ? op : -1;
}
  • 首先是排序数组。
  • 对于新计算的值,请将它们存储在array [i0-c0]范围内,此新数组不需要排序,因为它已经排序。
  • 当array [i-c]到达(i == c:true)结束时,忘了它,然后在arr [i0-c0]上工作。