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:
Each group must consist of distinct numbers, meaning that no duplicate numbers are allowed within a single group.
Each group (except the first one) must have a length strictly greater than the previous group.
Return an integer denoting themaximum number of groups you can create while satisfying these conditions.
Input: usageLimits =[1,2,5]Output: 3Explanation: 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 is3.So, the output is3.
Input: usageLimits =[2,1,2]Output: 2Explanation: 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 is2.So, the output is2.
Input: usageLimits =[1,1]Output: 1Explanation: 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 is1.So, the output is1.
To maximize the number of groups, we want to distribute the available usages to groups of increasing size. The smallest group has size 1, the next size 2, and so on. We can use binary search to find the largest k such that the sum of the first k natural numbers (1+2+…+k) can be formed with the available usage limits.
Sort the usageLimits in descending order (optional, but helps with greedy allocation).
Use binary search to find the maximum k such that the sum of the first k natural numbers is less than or equal to the total number of usages available.
For each candidate k, check if it’s possible to form groups of size 1 to k using the available usages (by simulating the allocation or using a greedy check).
import java.util.*;
classSolution {
publicintmaxIncreasingGroups(int[] usageLimits) {
Arrays.sort(usageLimits);
long sum = 0;
int ans = 0;
for (int x : usageLimits) {
sum += x;
if (sum >= (long)(ans + 1) * (ans + 2) / 2) ans++;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
funmaxIncreasingGroups(usageLimits: IntArray): Int {
usageLimits.sort()
var sum = 0Lvar ans = 0for (x in usageLimits) {
sum += x
if (sum >= (ans + 1L) * (ans + 2) / 2) ans++ }
return ans
}
}
1
2
3
4
5
6
7
8
9
10
classSolution:
defmaxIncreasingGroups(self, usageLimits: list[int]) -> int:
usageLimits.sort()
total =0 ans =0for x in usageLimits:
total += x
if total >= (ans +1) * (ans +2) //2:
ans +=1return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
impl Solution {
pubfnmax_increasing_groups(mut usage_limits: Vec<i32>) -> i32 {
usage_limits.sort();
letmut sum =0i64;
letmut ans =0;
for&x in&usage_limits {
sum += x asi64;
if sum >= ((ans +1) * (ans +2) /2) asi64 {
ans +=1;
}
}
ans
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution {
maxIncreasingGroups(usageLimits: number[]):number {
usageLimits.sort((a, b) =>a-b);
letsum=0, ans=0;
for (constxofusageLimits) {
sum+=x;
if (sum>= (ans+1) * (ans+2) /2) ans++;
}
returnans;
}
}