class Solution {
public:
int check(string s,int val,int k)
{/**< v数组用来统计区间不同字母个数,存在num中,len区间长度 */
int i=0,len=0,v[26]={0},num=0,cnt=0;
while(i<s.size())
{
if(v[s[i]-'a']==0)
num++,v[s[i]-'a']=1;
len++;
if(len*num>val)/**< 超出了限定,说明第i个字符不能和它左侧连接在一起 */
{
cnt++;/**< 子串数量+1 */
for(int j=0;j<26;j++)v[j]=0;/**< 重置 */
len=num=0;/**< 重置 */
}
else/**< 继续连接下一个字符 */
i++;
}
cnt++;/**< 循环结束时最后一段 */
return cnt<=k;
}
int getMaxValue(string str, int k) {
int i,j,mid,best=1e9,l=1,r=500000*26;
while(l<=r)/**< 二分计算最大成绩 */
{
mid=(l+r)/2;
if(check(str,mid,k))
r=mid-1,best=mid;
else
l=mid+1;
}
return best;
}
};
二分答案典型
最新推荐文章于 2024-07-08 22:12:26 发布