思路
首先理解题目给出的规则
1.数组长度 n
每个元素最小是 1
相邻的元素只能 +1 或 -1
整个数组的和不超过 maxSum
求第 index 位置的值最大是几
2.也就是说
一开始都是 1
把 index 的值提高,两侧的值跟随这增高
不断提升 index 的值,受牵连的元素越来越多
最终,形成一座山峰
3.画完图发现
如果给我 nums[index] 想要的值 x ,数组的长度 n ,和 index
我可以求出数组的和 sum
并且 sum 会随着 x 变大而增大
所以我决定使用二分模板来解决这个问题
4.最低值为 1
最高值为 maxSum + 1 (没 + 1 的我,狠狠的 wa 了一发)
实现一个求和的函数 long long calcSum(int x, int n, int index) (没用 long long 的我狠狠的 wa 了一发)
求和函数可以有多种实现
5.我的思路是
进来首先每个元素是 1 ,然后挖去 index 位置的 1 ,换成 x
然后左边计算 1 到 x 的和,如果数组不够长,截断计算
然后右边计算 x 到 1 的和,如果数组不够长,截断计算
再减去左边和右边的 1
大家可以按照自己的想法来实现
只要算的又快又对代码又少都可以
我感觉我写的不好
写完可以用图例中的数据验证一遍(没有验证的我狠狠的 wa 了一发)
作者:ikaruga
链接:https://leetcode-cn.com/problems/maximum-value-at-a-given-index-in-a-bounded-array/solution/given-index-in-a-bounded-array-by-ikarug-b8uc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int maxValue(int n, int index, int maxSum) {
int lo = 1;
int hi = maxSum + 1;
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (calcSum(mid, n, index) <= maxSum) {
lo = mid + 1;
}
else {
hi = mid;
}
}
return lo - 1;
}
long long calcSum(int x, int n, int index) {
long long sum = n - 1 + x;
long long left = min(index, x - 1);
sum += (1LL * ((x - left) + (x - 1))) * left / 2;
long long right = min(n - index - 1, x - 1);
sum += (1LL * ((x - 1) + (x - right))) * right / 2;
sum = sum - left - right;
//cout << x << ", " << sum << endl;
return sum;
}
};
作者:ikaruga
链接:https://leetcode-cn.com/problems/maximum-value-at-a-given-index-in-a-bounded-array/solution/given-index-in-a-bounded-array-by-ikarug-b8uc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。