嗨,我有以下代码来解决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;
}
答案 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;
}