Problem
Given an integer array instructions
, you are asked to create a sorted array from the elements in instructions
. You start with an empty container nums
. For each element from left to right in instructions
, insert it into nums
. The cost of each insertion is the minimum of the following:
- The number of elements currently in
nums
that are strictly less thaninstructions[i]
. - The number of elements currently in
nums
that are strictly greater thaninstructions[i]
.
For example, if inserting element 3
into nums = [1,2,3,5]
, the cost of insertion is min(2, 1)
(elements 1
and 2
are less than 3
, element 5
is greater than 3
) and nums
will become [1,2,3,3,5]
.
Return the total cost to insert all elements from instructions
into nums
. Since the answer may be large, return it modulo 10^9 + 7
Examples
Example 1:
|
|
Example 2:
|
|
Example 3:
|
|
Solution
Method 1 - Using Fenwick Tree or Binary Indexed Tree
To solve this problem, we need to calculate the cost of insertion for each element from the instructions
array into the sorted array nums
. The challenge is to efficiently compute the number of elements in the sorted container nums
that are:
- Strictly less than the current element (
left_count
). - Strictly greater than the current element (
right_count
). The cost is determined asmin(left_count, right_count)
for each insertion.
Approach
- Naive Solution with Linear Search:
- Maintain a list
nums
which holds sorted elements. - For each element in
instructions
, computeleft_count
andright_count
by iterating through all elements innums
. - Insert the current element into
nums
at the appropriate position to keep it sorted. - This approach has
O(n^2)
time complexity, which is inefficient for large inputs.
- Maintain a list
- Efficient Solution with Fenwick Tree (Binary Indexed Tree):
- Use a Fenwick Tree to efficiently query and update counts of elements less than and greater than the current element.
- Fenwick Tree allows us to:
- Query the prefix sum (counts of elements less than the current element).
- Query the suffix sum (counts of elements greater than the current element).
- Insert the current element into the Fenwick Tree and update the total cost.
Complexity
- ⏰ Time complexity:
O(n * log(max_val))
. The Fenwick Tree operations (query and update) each takeO(log(max_val))
. Letn
be the size ofinstructions
andmax_val
be the maximum value ininstructions
.- Total complexity is
O(n * log(max_val))
.
- Total complexity is
- 🧺 Space complexity:
O(max_val)
. The Fenwick Tree requiresO(max_val)
space.