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<len,除了放x、x-1……1之外,剩下的位置全部放1,也就是len-x  sum=\frac{(x+1)*x}{2}+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;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值