0

I am doing the following problem:

Given the array candies and the integer extraCandies, where candies[i] represents the number of candies that the ith kid has.

For each kid check if there is a way to distribute extraCandies among the kids such that he or she can have the greatest number of candies among them. Notice that multiple kids can have the greatest number of candies.

Example 1:

Input: candies = [2,3,5,1,3], extraCandies = 3 Output: [true,true,true,false,true] Explanation: Kid 1 has 2 candies and if he or she receives all extra candies (3) will have 5 candies --- the greatest number of candies among the kids. Kid 2 has 3 candies and if he or she receives at least 2 extra candies will have the greatest number of candies among the kids. Kid 3 has 5 candies and this is already the greatest number of candies among the kids. Kid 4 has 1 candy and even if he or she receives all extra candies will only have 4 candies. Kid 5 has 3 candies and if he or she receives at least 2 extra candies will have the greatest number of candies among the kids. Example 2:

Input: candies = [4,2,1,1,2], extraCandies = 1 Output: [true,false,false,false,false] Explanation: There is only 1 extra candy, therefore only kid 1 will have the greatest number of candies among the kids regardless of who takes the extra candy. Example 3:

Input: candies = [12,1,12], extraCandies = 10 Output: [true,false,true]

Constraints:

2 <= candies.length <= 100 1 <= candies[i] <= 100 1 <= extraCandies <= 50

here is my code and below my code is the error I am getting but it seems right?

const kidsWithCandies = (candies, extraCandies) => {
    let candiesTwo = [...candies]
    candiesTwo = candiesTwo.sort()
    
    let arr = []
    let highestNum = candiesTwo[candiesTwo.length -1]
    
    for(let i = 0; i < candies.length; i++) { 
        if(candies[i] + extraCandies >= highestNum) { 
            arr.push(true)
        }  else { 
          arr.push(false)
        }
    }
    return arr
}

I am getting

71 / 103 test cases passed.
Status: Wrong Answer
Submitted: 3 minutes ago
Input:
[1,10,10,3]
1
Output:
[false,true,true,true]
Expected:
[false,true,true,false]

3 Answers 3

1

By default sort method sorts items alphabetically. You should update from

candiesTwo = candiesTwo.sort()

to

candiesTwo.sort((a, b) => a-b);

for numerical sort.

Sign up to request clarification or add additional context in comments.

3 Comments

Or find maximum number by using Math.max(...candies) instead, however you pointed out the actual problem in the solution above.
Thank you. This is definitely nice to know for the future. I solved it also by using Math.max(...candies)
Math.max(...candies) works fine for most cases. But in edge case like candies length is very huge, it won't work. Of course for this problem it's fine (<100) @stephen1993
1

If we'd use sort, the time complexity would be an order of N Log N. Here is an O(N) solution:

const kidsWithCandies = (candies, extraCandies) => {
    let maxCandies = 0;
    const greatest = [];

    for (const candy of candies) {
        (candy > maxCandies) && (maxCandies = candy);
    }

    for (let index = 0; index < candies.length; ++index) {
        greatest.push(candies[index] + extraCandies >= maxCandies);
    }
    return greatest;
};

Comments

0

Use a compare function to sort numbers or they will be in alpha order. By default, the sort() method sorts the values as strings in alphabetical and ascending order.

Simple example

const candies = [4, 11, 22, 2, 1];

console.log('No compare function:', JSON.stringify([...candies].sort()))

candies.sort((a, b) => a - b);
console.log('With compare function:', JSON.stringify(candies))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.