# LC 2659. Make Array Empty
### [Problem link](https://leetcode.com/problems/make-array-empty/)
###### tags: `leedcode` `hard` `python`
You are given an integer array <code>nums</code> containing **distinct** numbers, and you can perform the following operations **until the array is empty** :
- If the first element has the **smallest** value, remove it
- Otherwise, put the first element at the **end** of the array.
Return an integer denoting the number of operations it takes to make <code>nums</code> empty.
**Example 1:**
```
Input: nums = [3,4,-1]
Output: 5
```
<table style="border: 2px solid black; border-collapse: collapse;">
<thead>
<tr>
<th style="border: 2px solid black; padding: 5px;">Operation</th>
<th style="border: 2px solid black; padding: 5px;">Array</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 2px solid black; padding: 5px;">1</td>
<td style="border: 2px solid black; padding: 5px;">[4, -1, 3]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">2</td>
<td style="border: 2px solid black; padding: 5px;">[-1, 3, 4]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">3</td>
<td style="border: 2px solid black; padding: 5px;">[3, 4]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">4</td>
<td style="border: 2px solid black; padding: 5px;">[4]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">5</td>
<td style="border: 2px solid black; padding: 5px;">[]</td>
</tr>
</tbody>
</table>
**Example 2:**
```
Input: nums = [1,2,4,3]
Output: 5
```
<table style="border: 2px solid black; border-collapse: collapse;">
<thead>
<tr>
<th style="border: 2px solid black; padding: 5px;">Operation</th>
<th style="border: 2px solid black; padding: 5px;">Array</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 2px solid black; padding: 5px;">1</td>
<td style="border: 2px solid black; padding: 5px;">[2, 4, 3]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">2</td>
<td style="border: 2px solid black; padding: 5px;">[4, 3]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">3</td>
<td style="border: 2px solid black; padding: 5px;">[3, 4]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">4</td>
<td style="border: 2px solid black; padding: 5px;">[4]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">5</td>
<td style="border: 2px solid black; padding: 5px;">[]</td>
</tr>
</tbody>
</table>
**Example 3:**
```
Input: nums = [1,2,3]
Output: 3
```
<table style="border: 2px solid black; border-collapse: collapse;">
<thead>
<tr>
<th style="border: 2px solid black; padding: 5px;">Operation</th>
<th style="border: 2px solid black; padding: 5px;">Array</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 2px solid black; padding: 5px;">1</td>
<td style="border: 2px solid black; padding: 5px;">[2, 3]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">2</td>
<td style="border: 2px solid black; padding: 5px;">[3]</td>
</tr>
<tr>
<td style="border: 2px solid black; padding: 5px;">3</td>
<td style="border: 2px solid black; padding: 5px;">[]</td>
</tr>
</tbody>
</table>
**Constraints:**
- <code>1 <= nums.length <= 10<sup>5</sup></code>
- <code>-10<sup>9</sup><= nums[i] <= 10<sup>9</sup></code>
- All values in <code>nums</code> are **distinct** .
## Solution 1
#### Python
```python=
class Solution:
def countOperationsToEmptyArray(self, nums: List[int]) -> int:
pos = {val: idx for idx, val in enumerate(nums)}
n = len(nums)
res = n
nums.sort()
for i in range(1, n):
if pos[nums[i - 1]] > pos[nums[i]]:
res += n - i
return res
```
>### Complexity
>n = nums.length
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(nlogn) | O(n) |
## Note
[reference](https://leetcode.com/problems/make-array-empty/solutions/3466800/java-c-python-easy-sort-solution/?orderBy=most_votes)
For those who don't understand why res is initialized to n at the beggining, and why res += n-i in the for loop, here's my explanation:
So the intuition behind this algorithm is to split the process of removing smallest elements into multiple passes. What does that mean?
For better explanation, I'll use an example [1,4,5,2,8,7,6,3], where n=size of array=8
We split the process of removing smallest elements into 4 passes:
remove [1,2,3]
remove [4,5,6]
remove [7]
remove [8]
OK, so this is where the magic happens, to remove [1,2,3] from the array, we need to remove 1, move 4 to the back, move 5 to the back, remove 2, move 8 to the back, move 7 to the back, move 6 to the back, remove 3. The first pass uses n=size of array=8 operations, regardless what elements are in the first pass. This is why we initialize res to n.
Now, the remaining of the array is [4,5,8,7,6] after removing [1,2,3]
We want to remove [4,5,6] from the remaining array, we need to remove 4, remove 5, move 8 to the back, move 7 to the back, remove 6. And this pass takes 5 operations, which is equal to the size of the remaining array. This is why res += n - i. (since n - i is the size of the remaining array)
The remaining array is now [8,7]
And its the same process for the third pass of removing [7], move 8 to the back, remove 7, wihch takes 2 operaions, which is equal to the remaining size of the array
The remaining array is now [8]
Lastly, we just remove 8, which takes 1 operation
Now, how do we split this process into passes in code?
Since the array has been sorted, ex: [1,2,3,4,5,6,7,8], and we know the index of each element using hashmap, if we encounter a number with smaller index than previous number, we can split out a pass.