1. Brute Force (Max-Heap)

class Solution:
    def minSumSquareDiff(self, nums1: List[int], nums2: List[int], k1: int, k2: int) -> int:
        diffs = [abs(nums1[i] - nums2[i]) for i in range(len(nums1))]
        maxHeap = [-d for d in diffs]
        heapq.heapify(maxHeap)

        k = k1 + k2
        while k > 0 and maxHeap[0] < 0:
            cur = -heapq.heappop(maxHeap)
            cur -= 1
            heapq.heappush(maxHeap, -cur)
            k -= 1

        return sum(d * d for d in maxHeap)

Time & Space Complexity

  • Time complexity: O((k1+k2)log⁡n)O((k_1 + k_2) \log n)
  • Space complexity: O(n)O(n)

Where nn is the length of nums1 and nums2.


2. Greedy + Max-Heap (Amortized)

class Solution:
    def minSumSquareDiff(self, nums1: List[int], nums2: List[int], k1: int, k2: int) -> int:
        K = k1 + k2
        n = len(nums1)
        maxheap = [-abs(nums1[i] - nums2[i]) for i in range(n)]
        if K > -sum(maxheap):
            return 0

        heapq.heapify(maxheap)

        while K > 0:
            curr = -heapq.heappop(maxheap)
            diff = max(K // n, 1)
            heapq.heappush(maxheap, -(curr - diff))
            K -= diff

        return sum(diff * diff for diff in maxheap)

Time & Space Complexity

  • Time complexity: O(nlog⁡Vlog⁡n)O(n \log V \log n) (amortized)
  • Space complexity: O(n)O(n)

Where nn is the length of nums1 and nums2, and VV is the maximum possible value of ∣nums1[i]−nums2[i]∣|nums1[i] - nums2[i]| (up to 10510^5).


3. Greedy + Max-Heap (Grouped by Count)

class Solution:
    def minSumSquareDiff(self, nums1: List[int], nums2: List[int], k1: int, k2: int) -> int:
        diffs = [abs(nums1[i] - nums2[i]) for i in range(len(nums1))]

        res = 0
        for num in diffs:
            res += num * num

        k = k1 + k2
        if res <= k:
            return 0

        count = Counter(diffs)
        maxHeap = [(-val, c) for val, c in count.items()]
        heapq.heapify(maxHeap)

        while k > 0 and maxHeap:
            negTop, cnt = heapq.heappop(maxHeap)
            top = -negTop
            nxt = -maxHeap[0][0] if maxHeap else 0

            reducible = cnt * (top - nxt)
            if k >= reducible:
                k -= reducible
                if maxHeap and -maxHeap[0][0] == nxt:
                    _, nxtCnt = heapq.heappop(maxHeap)
                    heapq.heappush(maxHeap, (-nxt, nxtCnt + cnt))
                elif nxt > 0:
                    heapq.heappush(maxHeap, (-nxt, cnt))
            else:
                q, r = divmod(k, cnt)
                newVal = top - q
                if r > 0:
                    heapq.heappush(maxHeap, (-(newVal - 1), r))
                if cnt - r > 0:
                    heapq.heappush(maxHeap, (-newVal, cnt - r))
                k = 0

        total = 0
        for negVal, cnt in maxHeap:
            total += (-negVal) * (-negVal) * cnt
        return total

Time & Space Complexity

  • Time complexity: O(nlog⁡n)O(n \log n)
  • Space complexity: O(n)O(n)

Where nn is the length of nums1 and nums2.


4. Greedy + Sorting

class Solution:
    def minSumSquareDiff(self, nums1: List[int], nums2: List[int], k1: int, k2: int) -> int:
        diffs = sorted((abs(a - b) for a, b in zip(nums1, nums2)), reverse=True)
        diffs.append(0)
        n = len(diffs) - 1
        k = k1 + k2

        res = 0
        i = 0
        carry = 0
        while i < n:
            j = i
            while j < n and diffs[j] == diffs[i]:
                j += 1
            cnt = (j - i) + carry
            nxt = diffs[j]
            cost = cnt * (diffs[i] - nxt)

            if k >= cost:
                k -= cost
                carry = cnt
                i = j
            else:
                q, r = divmod(k, cnt)
                res += r * (diffs[i] - q - 1) ** 2
                res += (cnt - r) * (diffs[i] - q) ** 2
                i = j
                break

        for d in diffs[i:n]:
            res += d * d

        return res

Time & Space Complexity

  • Time complexity: O(nlog⁡n)O(n \log n)
  • Space complexity: O(n)O(n)

Where nn is the length of nums1 and nums2.


class Solution:
    def minSumSquareDiff(self, nums1: List[int], nums2: List[int], k1: int, k2: int) -> int:
        diffs = [abs(a - b) for a, b in zip(nums1, nums2)]
        k = k1 + k2

        def cost(cap: int) -> int:
            return sum(d - cap for d in diffs if d > cap)

        lo, hi = 0, max(diffs)
        while lo < hi:
            mid = (lo + hi) // 2
            if cost(mid) <= k:
                hi = mid
            else:
                lo = mid + 1

        cap = lo
        extra = k - cost(cap) if cap > 0 else 0

        res = 0
        for d in diffs:
            if d < cap:
                res += d * d
            elif extra > 0:
                res += (cap - 1) ** 2
                extra -= 1
            else:
                res += cap * cap
        return res

Time & Space Complexity

  • Time complexity: O(nlog⁡V)O(n \log V)
  • Space complexity: O(n)O(n)

Where nn is the length of nums1 and nums2, and VV is the maximum possible value of ∣nums1[i]−nums2[i]∣|nums1[i] - nums2[i]| (up to 10510^5).