Skip to main content

Take Gifts From the Richest Pile - Solution & Explanation

EasyArrayHeap (Priority Queue)Simulation11 min readAsked at: Amazon, Meta, Google +1
Practice this problem

Problem Statement

You are given an integer array gifts denoting the number of gifts in various piles. Every second, you do the following:

  • Choose the pile with the maximum number of gifts.
  • If there is more than one pile with the maximum number of gifts, choose any.
  • Reduce the number of gifts in the pile to the floor of the square root of the original number of gifts in the pile.

Return the number of gifts remaining after k seconds.

 

Example 1:

Input: gifts = [25,64,9,4,100], k = 4
Output: 29
Explanation: 
The gifts are taken in the following way:
- In the first second, the last pile is chosen and 10 gifts are left behind.
- Then the second pile is chosen and 8 gifts are left behind.
- After that the first pile is chosen and 5 gifts are left behind.
- Finally, the last pile is chosen again and 3 gifts are left behind.
The final remaining gifts are [5,8,9,4,3], so the total number of gifts remaining is 29.

Example 2:

Input: gifts = [1,1,1,1], k = 4
Output: 4
Explanation: 
In this case, regardless which pile you choose, you have to leave behind 1 gift in each pile. 
That is, you can't take any pile with you. 
So, the total gifts remaining are 4.

 

Constraints:

  • 1 <= gifts.length <= 103
  • 1 <= gifts[i] <= 109
  • 1 <= k <= 103

Approach Overview

Problem Overview: You are given an array where each value represents a pile of gifts. For k seconds, you always choose the richest pile, take gifts equal to floor(sqrt(pile)), and put the remaining pile back. After k operations, return the total number of gifts left across all piles.

Approach 1: Heap-Based Simulation (Max Heap) (Time: O((n + k) log n), Space: O(n))

This approach uses a heap (priority queue) to efficiently access the largest pile each second. First, build a max heap from the input array. During each of the k iterations, remove the largest element using pop, compute the remaining pile size using floor(sqrt(value)), and push the updated value back into the heap. The heap guarantees that retrieving and reinserting the largest pile always takes O(log n) time. After completing all operations, iterate through the heap and sum the remaining piles.

The key insight is that every operation only affects the current maximum pile. A heap gives constant access to that element while maintaining efficient updates. This is the most natural way to simulate the process because it mirrors the problem statement: repeatedly choose the largest pile. Problems involving repeated "take the maximum" or "take the minimum" operations almost always benefit from a heap.

Approach 2: Sort and Dynamic Update (Time: O(k · n), Space: O(1) extra)

This approach uses sorting and manual updates instead of a heap. Start by sorting the array so the largest pile is at the end. For each of the k operations, take the largest element, compute floor(sqrt(value)), then reinsert it into the correct position to maintain sorted order. Reinsertion can be done by shifting elements or performing a binary search followed by insertion.

Because the array may need to shift many elements during each update, maintaining sorted order can cost up to O(n) per operation. Over k operations, the total runtime becomes O(k · n). This approach works well for small inputs and helps visualize the simulation process, but it scales worse than a heap when k or n grows.

The method still relies on the same core idea: repeatedly identify and update the maximum element. Sorting simply replaces the heap structure used in the optimal solution.

Recommended for interviews: The heap-based approach is the expected solution. It demonstrates strong understanding of array processing combined with a priority queue to repeatedly access the maximum element efficiently. The sorted simulation approach shows correct reasoning but does not scale well. Interviewers typically expect the O((n + k) log n) heap solution because it directly models the "always take the richest pile" requirement.

Approach 1: Heap-based Approach

This approach leverages a max-heap (priority queue) to efficiently find and update the pile with the maximum number of gifts repeatedly. By using a max-heap, we ensure that each operation takes logarithmic time, efficiently addressing the task of retrieving and updating the maximum element.

Steps:

  • Create a max-heap from the `gifts` array by storing negative values to simulate a max-behavior using a min-heap implementation.
  • For `k` iterations, extract the maximum element (this is the pile with the most gifts), compute its new value (floor of the square root), and push it back into the heap.
  • After performing `k` operations, sum all the remaining elements in the heap to get the total number of gifts remaining.

This Python implementation uses the `heapq` module to manage a max-heap and perform operations efficiently. We convert all gift numbers to negative to simulate a max-heap. After `k` operations, we return the sum of negated values from the heap, which gives us the total gifts remaining.

Code

Python

Java

Complexity

Time Complexity: O((n + k) log n), where n is the number of piles since each heap operation takes logarithmic time relative to the number of elements. Space Complexity: O(n) for storing the heap.

Try this approach in the editor →

Approach 2: Sort and Dynamic Update Approach

This approach uses a sorted list to keep track of piles of gifts. Although less optimal than a heap-based approach, it sorts the list initially and updates the list dynamically through each iteration, leveraging Python's list sorting capabilities.

Steps:

  • Sort the list of gifts in descending order initially.
  • For `k` iterations, modify the largest element by taking its square root, place it back in position, and re-sort if necessary.
  • After the iterations, sum the elements to get the total number of gifts remaining.

This solution sorts the list initially and after every update, ensuring the maximum element is always processed. After `k` operations, the sum of the list gives the total remaining gifts.

Code

Python

C++

Complexity

Time Complexity: O(n log n * k) mainly from repeated sorting of the list. Space Complexity: O(1) extra space beyond the input list.

Try this approach in the editor →

Approach 3: Priority Queue (Max Heap)

We can store the array gifts in a max heap, and then loop k times, each time taking out the top element of the heap, taking the square root of it, and putting the result back into the heap.

Finally, we add up all the elements in the heap as the answer.

The time complexity is O(n + k times log n), and the space complexity is O(n). Here, n is the length of the array gifts.

Code

Python

Java

C++

Go

TypeScript

Rust

Try this approach in the editor →

Complexity Comparison

ApproachComplexity
Heap-based Approach

Time Complexity: O((n + k) log n), where n is the number of piles since each heap operation takes logarithmic time relative to the number of elements. Space Complexity: O(n) for storing the heap.

Sort and Dynamic Update Approach

Time Complexity: O(n log n * k) mainly from repeated sorting of the list. Space Complexity: O(1) extra space beyond the input list.

Priority Queue (Max Heap)—

Detailed Complexity Analysis

ApproachTimeSpaceWhen to Use
Heap-Based Simulation (Max Heap)O((n + k) log n)O(n)Best general solution when repeatedly accessing the largest element
Sort and Dynamic UpdateO(k · n)O(1) extraUseful for small inputs or when avoiding extra data structures

Video Solution

Take Gifts From the Richest Pile - Leetcode 2558 - Python • NeetCodeIO • 5,538 views views

Watch 9 more video solutions →

Frequently Asked Questions

Is Take Gifts From the Richest Pile easy or hard?
Take Gifts From the Richest Pile is classified as an Easy problem on LeetCode with an acceptance rate above 70%. The main challenge is recognizing that a max heap efficiently models the repeated "choose the largest pile" operation.
Take Gifts From the Richest Pile Python or Java solution?
Python solutions typically use the heapq module with negative values to simulate a max heap. Java solutions use PriorityQueue with a reverse comparator to maintain the largest element at the top.
How to solve Take Gifts From the Richest Pile in O(k log n)?
Use a max heap to always access the largest pile in O(1) and update it in O(log n). For each of the k steps, remove the largest value, compute floor(sqrt(value)), and push the result back. This avoids scanning the entire array each time.
What is the best approach for Take Gifts From the Richest Pile?
The best approach uses a max heap (priority queue). Build a heap from the piles, repeatedly extract the largest pile, replace it with floor(sqrt(value)), and push it back. Each operation takes O(log n), giving an overall complexity of O((n + k) log n).
What data structure is used in Take Gifts From the Richest Pile?
The primary data structure is a max heap (priority queue). It efficiently tracks the largest pile after every update, making it ideal for problems where the maximum element must be repeatedly accessed and modified.
What is the time complexity of Take Gifts From the Richest Pile?
The optimal heap-based solution runs in O((n + k) log n) time. Building the heap takes O(n), and each of the k operations performs a pop and push that cost O(log n). The space complexity is O(n) for the heap.
Is Take Gifts From the Richest Pile asked at Google or Amazon interviews?
Heap-based simulation problems like this appear frequently in interviews at companies such as Amazon, Google, and Meta. Interviewers use them to test understanding of priority queues and efficient repeated maximum or minimum selection.

Ready to solve this problem?

Practice Take Gifts From the Richest Pile with our built-in code editor and test cases.

Practice on FleetCode