<p>Given two integer arrays <code>nums1</code> and <code>nums2</code>, return <em>an array of their <span data-keyword="array-intersection">intersection</span></em>. Each element in the result must be <strong>unique</strong> and you may return the result in <strong>any order</strong>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums1 = [1,2,2,1], nums2 = [2,2]
<strong>Output:</strong> [2]
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums1 = [4,9,5], nums2 = [9,4,9,8,4]
<strong>Output:</strong> [9,4]
<strong>Explanation:</strong> [4,9] is also accepted.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

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

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        if len(nums1) < len(nums2):
            shorter_arr = nums1
            longer_arr = nums2
        else:
            shorter_arr = nums2
            longer_arr = nums1

        non_dups_short = list(dict.fromkeys(shorter_arr))
        non_dups_long = list(dict.fromkeys(longer_arr))
        non_dups_long.sort()

        ans = []
        for n in non_dups_short:
            high = len(non_dups_long) - 1
            low = 0
            while low <= high:
                middle = (high + low) // 2
                guess = non_dups_long[middle]
                if guess == n:
                    ans.append(guess)
                    break
                elif guess < n:
                    low = middle + 1
                else:
                    high = middle - 1
        return ans
             
16700