<p>You are given a <strong>0-indexed</strong> integer array <code>nums</code> and an integer <code>x</code>.</p>

<p>Find the <strong>minimum absolute difference</strong> between two elements in the array that are at least <code>x</code> indices apart.</p>

<p>In other words, find two indices <code>i</code> and <code>j</code> such that <code>abs(i - j) &gt;= x</code> and <code>abs(nums[i] - nums[j])</code> is minimized.</p>

<p>Return<em> an integer denoting the <strong>minimum</strong> absolute difference between two elements that are at least</em> <code>x</code> <em>indices apart</em>.</p>

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

<pre>
<strong>Input:</strong> nums = [4,3,2,4], x = 2
<strong>Output:</strong> 0
<strong>Explanation:</strong> We can select nums[0] = 4 and nums[3] = 4. 
They are at least 2 indices apart, and their absolute difference is the minimum, 0. 
It can be shown that 0 is the optimal answer.
</pre>

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

<pre>
<strong>Input:</strong> nums = [5,3,2,10,15], x = 1
<strong>Output:</strong> 1
<strong>Explanation:</strong> We can select nums[1] = 3 and nums[2] = 2.
They are at least 1 index apart, and their absolute difference is the minimum, 1.
It can be shown that 1 is the optimal answer.
</pre>

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

<pre>
<strong>Input:</strong> nums = [1,2,3,4], x = 3
<strong>Output:</strong> 3
<strong>Explanation:</strong> We can select nums[0] = 1 and nums[3] = 4.
They are at least 3 indices apart, and their absolute difference is the minimum, 3.
It can be shown that 3 is the optimal answer.
</pre>

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

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

from sortedcontainers import SortedList

class Solution:
    def minAbsoluteDifference(self, nums: List[int], x: int) -> int:
        # result = float('inf')
        # for i in range(len(nums)):
        #     for j in range(i - x + 1):
        #         result = min(result, abs(nums[i] - nums[j]))
            
        # return result

        #if we just think about the problem where j + x <= i, find min abs(nums[i] - nums[j])
        
        #lets say we cache all values 10 5 1 and then see 4

        #we want to find the number closest to 4, we can use binary search
        #but this requires the cache values to be sorted
        #but we can do that pretty easily with a heap 

        sort = SortedList()
        result = float('inf')

        for i in range(len(nums) - x):
            sort.add(nums[i])

            target = nums[i + x]

            l, r = 0, len(sort)-1
            smallest_diff = float('inf')
            while l <= r:
                mid = (l + r) // 2

                diff = sort[mid] - target
                smallest_diff = min(smallest_diff, abs(diff))

                if diff == 0: 
                    break
                if diff < 0:
                    l = mid + 1
                else:
                    r = mid - 1
            
            result = min(result, smallest_diff)
        
        return result



            



        



        
3043