<p>You are given an array of positive integers <code>price</code> where <code>price[i]</code> denotes the price of the <code>i<sup>th</sup></code> candy and a positive integer <code>k</code>.</p>

<p>The store sells baskets of <code>k</code> <strong>distinct</strong> candies. The <strong>tastiness</strong> of a candy basket is the smallest absolute difference of the <strong>prices</strong> of any two candies in the basket.</p>

<p>Return <em>the <strong>maximum</strong> tastiness of a candy basket.</em></p>

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

<pre>
<strong>Input:</strong> price = [13,5,1,8,21,2], k = 3
<strong>Output:</strong> 8
<strong>Explanation:</strong> Choose the candies with the prices [13,5,21].
The tastiness of the candy basket is: min(|13 - 5|, |13 - 21|, |5 - 21|) = min(8, 8, 16) = 8.
It can be proven that 8 is the maximum tastiness that can be achieved.
</pre>

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

<pre>
<strong>Input:</strong> price = [1,3,1], k = 2
<strong>Output:</strong> 2
<strong>Explanation:</strong> Choose the candies with the prices [1,3].
The tastiness of the candy basket is: min(|1 - 3|) = min(2) = 2.
It can be proven that 2 is the maximum tastiness that can be achieved.
</pre>

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

<pre>
<strong>Input:</strong> price = [7,7,7,7], k = 2
<strong>Output:</strong> 0
<strong>Explanation:</strong> Choosing any two distinct candies from the candies we have will result in a tastiness of 0.
</pre>

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

<ul>
	<li><code>2 &lt;= k &lt;= price.length &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= price[i] &lt;= 10<sup>9</sup></code></li>
</ul>

class Solution:
    def maximumTastiness(self, price: List[int], k: int) -> int:
        # We want a maximum of the minimums

        # Sorting the input array will give
        # [1, 2, 5, 8, 12, 21]

        # Now sorted, we can be certain the absolute difference between
        # any two candies is increasing or 0 from left to right

        price = sorted(price)

        # This function checks if we can place k candies
        # with a minimum of `minPriceDiff` between each candy
        def checkPriceConstraint(minPriceDiff):
            candiesInBasket = 1    # Always use the first one because
            lastCandyAddedIdx = 0  # there is no constraint on it

            for idx in range(1, len(price)):
                if price[idx] - price[lastCandyAddedIdx] >= minPriceDiff:
                    lastCandyAddedIdx = idx
                    candiesInBasket += 1
                
                if candiesInBasket >= k:
                    return True
            return False

        # This value is the global max difference between any two candies
        maxDiff = abs(price[-1] - price[0])

        # Binary Search on the different price constraints between any 2 candies in the basket
        # While doing it, track the max of the price constraints that are valid
        # This works because for any given price constraint, if it works
        # then everything less than it will work, if it doesn't then anything right
        # of it won't
        leftPrice = 0
        rightPrice = maxDiff
        maxOfMins = 0
        while leftPrice <= rightPrice:
            midPrice = (leftPrice + rightPrice) // 2
            if checkPriceConstraint(midPrice):
                maxOfMins = midPrice
                leftPrice = midPrice + 1
            else:
                rightPrice = midPrice - 1
        
        return maxOfMins
1084