LeetCode 1681. Minimum Incompatibility Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1681. Minimum Incompatibility

Description

You are given an integer array nums​​​ and an integer k. You are asked to distribute this array into k subsets of equal size such that there are no two equal elements in the same subset.

A subset's incompatibility is the difference between the maximum and minimum elements in that array.

Return the minimum possible sum of incompatibilities of the k subsets after distributing the array optimally, or return -1 if it is not possible.

A subset is a group integers that appear in the array with no particular order.

 

Example 1:

Input: nums = [1,2,1,4], k = 2
Output: 4
Explanation: The optimal distribution of subsets is [1,2] and [1,4].
The incompatibility is (2-1) + (4-1) = 4.
Note that [1,1] and [2,4] would result in a smaller sum, but the first subset contains 2 equal elements.

Example 2:

Input: nums = [6,3,8,1,3,1,2,2], k = 4
Output: 6
Explanation: The optimal distribution of subsets is [1,2], [2,3], [6,8], and [1,3].
The incompatibility is (2-1) + (3-2) + (8-6) + (3-1) = 6.

Example 3:

Input: nums = [5,3,3,6,3,3], k = 3
Output: -1
Explanation: It is impossible to distribute nums into 3 subsets where no two elements are equal in the same subset.

 

Constraints:

  • 1 <= k <= nums.length <= 16
  • nums.length is divisible by k
  • 1 <= nums[i] <= nums.length

Solutions

Solution 1: Preprocessing + State Compression + Dynamic Programming

Let's assume that the size of each subset after partitioning is m, so m=nk, where n is the length of the array.

We can enumerate all subsets i, where i ∈ [0, 2n), if the binary representation of subset i has m ones, and the elements in subset i are not repeated, then we can calculate the incompatibility of subset i, denoted as g[i], i.e., g[i]=max_{j ∈ i} {nums[j]} - min_{j ∈ i} {nums[j]}.

Next, we can use dynamic programming to solve.

We define f[i] as the minimum sum of incompatibilities when the current partitioned subset state is i. Initially, f[0]=0, which means no elements are partitioned into the subset, and the rest f[i]=+∞.

For state i, we find all undivided and non-repeated elements, represented by a state mask. If the number of elements in state mask is greater than or equal to m, then we enumerate all subsets j of mask, and satisfy j ⊆ mask, then f[i ∪ j]=min {f[i ∪ j], f[i]+g[j]}.

Finally, if f[2n-1]=+∞, it means that it cannot be partitioned into k subsets, return -1, otherwise return f[2n-1].

The time complexity is O(3n), and the space complexity is O(2n). Here, n is the length of the array.

PythonJavaC++GoTypeScriptC#
class Solution: def minimumIncompatibility(self, nums: List[int], k: int) -> int: n = len(nums) m = n // k g = [-1] * (1 << n) for i in range(1, 1 << n): if i.bit_count() != m: continue s = set() mi, mx = 20, 0 for j, x in enumerate(nums): if i >> j & 1: if x in s: break s.add(x) mi = min(mi, x) mx = max(mx, x) if len(s) == m: g[i] = mx - mi f = [inf] * (1 << n) f[0] = 0 for i in range(1 << n): if f[i] == inf: continue s = set() mask = 0 for j, x in enumerate(nums): if (i >> j & 1) == 0 and x not in s: s.add(x) mask |= 1 << j if len(s) < m: continue j = mask while j: if g[j] != -1: f[i | j] = min(f[i | j], f[i] + g[j]) j = (j - 1) & mask return f[-1] if f[-1] != inf else -1(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !