力扣1802.有界数组中指定下标处的最大值
-
二分答案
- 贪心求出数组最小和
-
class Solution { public: int maxValue(int n, int index, int maxSum) { auto check = [&](long long mid) -> bool { long long sum = mid; //先求左边 看看能不能递减到1 if(index > mid - 1) { long long an = mid - 1,a1 = 1,cnt = mid - 1; sum += cnt * (a1 + an) / 2; sum += index - cnt; } else { long long cnt = index,an = mid-1 ,a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; } //再求右边 看看能不能递减到1 if(n - index - 1 > mid - 1) { long long an = mid - 1,a1 = 1,cnt = mid - 1; sum += cnt * (a1 + an) / 2; sum += n - index - 1 - cnt; } else { long long cnt = n - index - 1,an = mid - 1,a1 = an - cnt + 1; sum += cnt * (a1 + an) / 2; } return sum <= maxSum; }; int l = 1,r = maxSum; while(l<r) { long long mid = l + r + 1 >> 1; if(check(mid)) l = mid; else r = mid - 1; } return (int)l; } };