0
点赞
收藏
分享

微信扫一扫

【LeetCode】416. 分割等和子集


将字母按照数量多少排序
AAAAA
BBB
CC
D
E
F

例如n=2
则一种可行的选择方案就是
ABCABCADEAF_A

class Solution {
public:
int leastInterval(vector<char>& a, int n) {
vector< int> v(26,0);
for(char c:a){
++v[ c- 'A' ];
}

int cur = a.size();
int ret = 0;
while(cur > 0) {

sort( v.begin(),v.end(),[&](int a,int b){
return a > b;
});

for(int i=0;i<n+1;++i){
if( cur > 0 ){
++ ret;
}
if( i >= v.size() || v[i]==0 ){
;
}else{
--v[i];
--cur;
}
}
}
return ret;
}
};

【LeetCode】416. 分割等和子集_算法

​​https://leetcode.cn/problems/task-scheduler/solution/by-60late-t4pw/​​

先用最多的数组拉开距离
剩下的字母如果出现次数和最多的字母一样总长度就会多1
否则剩下的元素填空就可以
如果前面的空都填满了,这种时候就是所有字母的总长度
因为剩下的字母一定可以找到一中插入的方案并且不会产生气泡

class Solution {
public:
int leastInterval(vector<char>& a, int n) {
vector<int> v(26,0);
for(char c:a){
++v[ c- 'A' ];
}

sort(v.begin(),v.end(),greater<int>());

int al = a.size();
int ret = v[0] + n* (v[0]-1);
for(int i=1;i<26;++i){
if( v[i] == v[0] ){
++ret;
}
}

return std::max<int>(al,ret);
}
};

【LeetCode】416. 分割等和子集_leetcode_02


举报

相关推荐

0 条评论