思路:
设指定下标处的最大值为x 暴力做法就是枚举1~maxsum看区间内哪个数满足条件
暴力做会超时,所以我们用二分查找满足条件的x
题目要求相邻的数差值不超过1
所以写一个sum函数 sum(x,len) 计算长度为len的区间且最大值为x的数组之和
- 如果x≥len,也就是x、x-1……x-len+1,比如5 4 3
- 如果x<len,除了放x、x-1……1之外,剩下的位置全部放1,也就是len-x
二分左边界l=1,r=maxsum
枚举每个mid 因为求不超过x的最大值 所以用先l=mid的二分模板
- 如果mid的左侧总和+mid的右侧总和≤maxsum 则l=mid
- 否则r=mid-1
class Solution {
public:
long long sum(long long x,int len)
{
return x>=len? (x+x-len+1)*len/2:(x+1)*x/2+len-x;
}
int maxValue(int n, int index, int maxSum) {
int l=1,r=maxSum;
while(l<r)
{
int mid=(l+r+1)>>1;
if(sum(mid-1,index)+sum(mid,n-index)<=maxSum) l=mid;
else r=mid-1;
}
return l;
}
};