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

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

这题有点意思,本质上还是可以通过已知index和n的值计算出关于任意nums[index]的值对应的nums数组和的最小值,找到nums[index]与nums数组和的最小值之间的函数关系之后,即可通过遍历或者二分的方法求得最大的nums[index]的值。

class Solution {
public:
    double sumindex(int n,int index,double x){
        double l=index+1,r=n-index,ans=0;
        //l=(l<0)? 0:l;r=(r<0)? 0:r;
        ans+=(x>l)? (x+x-l+1)*l/2:(x+1)*x/2+l-x;
        ans+=(x>r)? (x+x-r+1)*r/2:(x+1)*x/2+r-x;
        return ans-x;//最小值为1没说
    }//求出当n和index固定时对于某个x=nums[index],nums数组和的最小值

    int maxValue(int n, int index, int maxSum) {
        /*遍历换二分
        for (int i=1;i<=maxSum;i++){
            if (sumindex(n,index,i)>maxSum)
            return i-1;
        }
        */
        int l=1,r=maxSum,mid;
        while(l<r){
            mid=(l+r+1)>>1;//除2
            if (sumindex(n,index,mid)>maxSum)
            r=mid-1;
            else l=mid;
        }
        return l;
    }
    
};