最大购买的玩具超时

时间:2013-09-01 04:06:30

标签: javascript algorithm

所以,是的,我有一个问题,我已经解决但仍然在测试用例中给出超时错误,我无法弄清楚原因。

你需要为他的生日买你的侄子玩具。但你只有有限的资金。但是,你想为你的侄子购买尽可能多的独特玩具。编写一个函数,返回您可以购买的最大数量的独特玩具。

函数的参数是整数数组成本,其中包含每个玩具的成本和整数预算,这是您可以花费的最大金额。

返回表示您可以购买的独特玩具的最大数量的整数

约束

如果N是玩具数量而K是预算...... 1·; = N< = 105 1·; = K&LT = 109 1< =任何玩具的价格< = 109

示例输入

费用:{1,12,5,111,200,1000,10} 预算:50 样本返回值

4 解释

他最多只能买4件玩具。这些玩具有以下价格:1,12,5,10。

所以这就是我写的内容,它不断给出10个测试用例的超时错误。我无法弄明白为什么

function maxPurchasedToys(costs, budget) {

    var costsLess=[];
    var removeFromArray=function(arr, value){
        for(i in arr){
            if(arr[i]==value){
                arr.splice(i,1);
                break;
            }
        }
        return costsLess;
    }
    //First let's get a new array consisting only of costs that are equal to or below the budget
    costs.map(function(x){x<budget?costsLess.push(x):1;})
    var sum=0;
    costsLess.map(function(x){sum+=x;});//Get the sum of budget

    while(sum>=budget){
        var max=Math.max.apply( Math, costsLess );
        costsLess=removeFromArray(costsLess,max);//Remove the biggest element to ensure that the costs fall within budget
        sum=0;
        costsLess.map(function(x){sum+=x;});//Get the new sum of budget

    }

    return costsLess.length;
}

我尝试了以下案例:原始测试案例,[5000,2000,20,200],50和其他几个案例。全部执行得很好

2 个答案:

答案 0 :(得分:1)

为什么不简单地排序和迭代?

function maxPurchasedToys (costs, budget) {
    var i = 0, sum = 0, count = 0,
        l = costs.length;

    costs.sort(function (a, b) { return a - b });

    while ( i < l ) {
        if ( budget >= sum + costs[i] ) {
            sum = sum + costs[i];
            count++;
            i++;
        } else {
            break;
        }
    }

    return count;
}

这是小提琴:http://jsfiddle.net/Ya5MK/


如果你能够使用ES5数组方法(你正在使用map,我想你可以),使用它:

function maxPurchasedToys (costs, budget) {
    var sum = 0, count = 0;
    costs.sort(function (a, b) { return a - b }).some(function (cost) {
        if ( budget >= sum + cost ) {
            sum = sum + cost;
            count++;
        } else {
            return true;
        }
    });

    return count;
}

这是小提琴:http://jsfiddle.net/Ya5MK/1/

答案 1 :(得分:0)

您可以尝试使用另一种接近排序您的费用数组升序,并查看您可以在该数组上获取的距离

http://www.w3schools.com/jsref/jsref_sort.asp

function maxPurchasedToys (costs, budget) {
    costs.sort(function(a,b){return a-b});
    count = 0;
    money = budget;
    for (i=0; i<costs.length(); i++){
        if (money > costs[i]){
            money -= costs[i];
            count ++;
        }
        else{
            break;
        }
    }
    return count;
}