LeetCode-in-Java

2790. Maximum Number of Groups With Increasing Length

Hard

You are given a 0-indexed array usageLimits of length n.

Your task is to create groups using numbers from 0 to n - 1, ensuring that each number, i, is used no more than usageLimits[i] times in total across all groups. You must also satisfy the following conditions:

Return an integer denoting the maximum number of groups you can create while satisfying these conditions.

Example 1:

Input: usageLimits = [1,2,5]

Output: 3

Explanation:

In this example, we can use 0 at most once, 1 at most twice, and 2 at most five times.

One way of creating the maximum number of groups while satisfying the conditions is:

Group 1 contains the number [2].

Group 2 contains the numbers [1,2].

Group 3 contains the numbers [0,1,2].

It can be shown that the maximum number of groups is 3.

So, the output is 3.

Example 2:

Input: usageLimits = [2,1,2]

Output: 2

Explanation:

In this example, we can use 0 at most twice, 1 at most once, and 2 at most twice.

One way of creating the maximum number of groups while satisfying the conditions is:

Group 1 contains the number [0].

Group 2 contains the numbers [1,2].

It can be shown that the maximum number of groups is 2.

So, the output is 2.

Example 3:

Input: usageLimits = [1,1]

Output: 1

Explanation:

In this example, we can use both 0 and 1 at most once.

One way of creating the maximum number of groups while satisfying the conditions is:

Group 1 contains the number [0].

It can be shown that the maximum number of groups is 1.

So, the output is 1.

Constraints:

Solution

import java.util.Arrays;
import java.util.List;

public class Solution {
    public int maxIncreasingGroups(List<Integer> usageLimits) {
        int n = usageLimits.size();
        long total = 0;
        long k = 0;
        int[] count = new int[n + 1];
        Arrays.fill(count, 0);
        for (int a : usageLimits) {
            int localA = (int) Math.min(a, (double) n);
            count[localA]++;
        }
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j < count[i]; j++) {
                total += i;
                if (total >= (k + 1) * (k + 2) / 2) {
                    k++;
                }
            }
        }
        return (int) k;
    }
}