长度递增组的最大数目
给你一个下标从 0 开始、长度为 n 的数组 usageLimits 。
你的任务是使用从 0 到 n - 1 的数字创建若干组,并确保每个数字 i 在 所有组 中使用的次数总共不超过 usageLimits[i] 次。此外,还必须满足以下条件:
- 每个组必须由 不同 的数字组成,也就是说,单个组内不能存在重复的数字。
- 每个组(除了第一个)的长度必须 严格大于 前一个组。
在满足所有条件的情况下,以整数形式返回可以创建的最大组数。
1. 贪心 + 排序+ 数学
对于排序数组,我们只需找到诸如123456的排列,便可使得组的分配增加
即当前数字大于对应位所需的数,可使得组增加
同时,假如前面的数不足以构造新的组,后面的数可以与前面合并,以满足组的要求
所以在决定新的组能形成与否的时候,只需判断总量大于对应组大小最基础的总量即可
思考:有没有可能存在总量大于基础值,对应位的量小于对应值,不能形成新的组的情况
即前面有组拉高了总量,而当前值小于应有值,比如123333
可以证明不可能存在该情况
假使数的个数与组一致,前面假使有数拉高总量,由于是非递减数列,当前数必然满足对应位要求
假使数的个数大于组的个数,多出的数可以灵活分配给原来的组和新的组,使恰好满总每个组的要求(是否能错开避免重复?)
class Solution {
public:
int maxIncreasingGroups(vector<int>& usageLimits) {
sort(usageLimits.begin(),usageLimits.end());
long long res = 0;
long long s = 0;
for(auto num:usageLimits){
s+=num;
if(s>=(res+1)*(res+2)/2)//尝试分配下一个组,满足要求则添加
res += 1;
}
return res;
}
};