Daily Archives: June 22, 2019

lc945. Minimum Increment to Make Array Unique

Solution 1 takes O(N^2) time, O(1) space, it requires sort the array. Then iterate the element 1 by 1. The point is to memorize the previous element where it reaches. Then calculate for current is based on previous reach.

945_1

// reach is the height it should reach on each element
public static int minIncrementForUnique3(int[] A) {
    int ans = 0, reach = Integer.MIN_VALUE;
    Arrays.sort(A);
    for (int a : A) {
        reach = Math.max(a, reach + 1);
        ans += a >= reach ? 0 : reach - a;
    }
    return ans;
}

Second solution takes O(N + KlogK) time, where K is the number of different number in array. Use TreeMap to store the number for each element. Still remember previous element where it reaches.

945_2

945_3

Increment is the size for green part. Come up with a formula to calculate that part.

public static int minIncrementForUnique(int[] A) {
    TreeMap<Integer, Integer> tm = new TreeMap<>();
    for (int a : A) {
        tm.put(a, tm.getOrDefault(a, 0) + 1);
    }
    int reach = Integer.MIN_VALUE, ans = 0;
    for (Map.Entry<Integer, Integer> entry : tm.entrySet()) {
        int key = entry.getKey(), num = entry.getValue();
        reach = Math.max(reach + 1, key);
        ans += reach * num + num * (num - 1) - key * num;
        reach += num - 1;
    }
    return ans;
}

Solution 3 is similar to solution 1. Since the element in A[] won’t be greater than 4000. So create an array with length 4000. Do similar solution as solution 1.