<p>You are given two integer arrays <code>nums1</code> and <code>nums2</code> both of the same length. The <strong>advantage</strong> of <code>nums1</code> with respect to <code>nums2</code> is the number of indices <code>i</code> for which <code>nums1[i] &gt; nums2[i]</code>.</p>

<p>Return <em>any permutation of </em><code>nums1</code><em> that maximizes its <strong>advantage</strong> with respect to </em><code>nums2</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> nums1 = [2,7,11,15], nums2 = [1,10,4,11]
<strong>Output:</strong> [2,11,7,15]
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> nums1 = [12,24,8,32], nums2 = [13,25,32,11]
<strong>Output:</strong> [24,32,8,12]
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums1.length &lt;= 10<sup>5</sup></code></li>
	<li><code>nums2.length == nums1.length</code></li>
	<li><code>0 &lt;= nums1[i], nums2[i] &lt;= 10<sup>9</sup></code></li>
</ul>

class Solution:
    def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # sort nums1 in ascending order
        nums1.sort()
        take = collections.defaultdict(list)

        # process nums2 in descending order, and compare each number with highest num in nums1 (check the last index -1)
        for b in reversed(sorted(nums2)):
            if b < nums1[-1]:
                # keep track the number in nums1 that is bigger than current number in nums2 and store it in the map
                # note that it removes the number from nums1 since it makes easier to just check the highest num in nums1
                take[b].append(nums1.pop())

        # the map may not contain all keys from the numbers in nums2, in case no number in nums1 that is bigger than
        # the number in nums2, which in that case it just pull the next highest number in nums1
        ans = []
        # the numbers returned are from nums1 but based on the order from nums2
        # that's why it iterates nums2 and then look up from the map, or pick the
        # remaining number from nums1, if particular number from nums2 not in hash map
        for b in nums2:
            if b in take and take[b]:
                ans.append(take[b].pop())
            else:
                ans.append(nums1.pop())

        return ans
42292