leetcode.1802 有界数组中指定下标处的最大值 - 二分 + 数学

1802. 有界数组中指定下标处的最大值

思路:

设指定下标处的最大值为x  暴力做法就是枚举1~maxsum看区间内哪个数满足条件

暴力做会超时,所以我们用二分查找满足条件的x

题目要求相邻的数差值不超过1

所以写一个sum函数  sum(x,len) 计算长度为len的区间且最大值为x的数组之和

  • 如果x≥len,也就是x、x-1……x-len+1,比如5 4 3  sum=\frac{(x+x-len+1)*len}{2}
  • 如果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>1;
            if(sum(mid-1,index)+sum(mid,n-index)<=maxSum) l=mid;
            else r=mid-1;
        }
        return l;
    }
};

 

你可能感兴趣的:(leetcode每日一题,算法,leetcode,职场和发展,二分)