[M数学] lc1802. 有界数组中指定下标处的最大值(贪心+二分+数学推公式)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M数学] lc1802. 有界数组中指定下标处的最大值(贪心+二分+数学推公式)相关的知识,希望对你有一定的参考价值。
文章目录
1. 题目来源
2. 题目解析
直觉的贪心思路,证明看官方题解吧。至于数学思路也推荐看官方题解,一开始确实想着推公式的,最后没走下去。
贪心思路:
- 让
index
值最大,剩余两边依次递减即可 index
值越大,形成后的数组总和越大,越接近maxSum
所以,可以在不超过 maxSum
二分最大的 arr[index]
是多少即可,也就是二分答案了。
index
作为最大值的下标,如何计算左侧、右侧的元素和,策略如下:
- 左侧待填充的长度为
index
,右侧待填充的长度为n-index-1
- 当二分答案值能将这个长度填满时,则意味着这个长度的尾部,不需要用 1 来做最后填充,反之则需要用 1 来做最后填充。
- 不用 1 填充时,说明
length+1<big
即为等差数列,首项需要单独计算 - 用 1 填充时,等差数列,首项为 1 / 0
- 不用 1 填充时,说明
计算过程会超过 int
,需要开 long
。
- 时间复杂度: O ( l o g n ) O(log_n) O(logn)
- 空间复杂度: O ( 1 ) O(1) O(1)
class Solution
public:
int maxValue(int n, int index, int maxSum)
int l = 1, r = maxSum; // 二分最大值
while (l < r)
int mid = l + r + 1 >> 1;
if (check(mid, n, index, maxSum)) l = mid;
else r = mid - 1;
return r;
// 最大值是 mid,左侧长度为 index(不包括 mid) 右侧长度为 n - index - 1(不包括mid)
bool check(int mid, int n, int index, int maxSum)
int ll = index, lr = n - index - 1;
return mid + cal(mid, ll) + cal(mid, lr) <= maxSum;
// 如果 长度+1 < 最大值的话,说明最大值依次递减到数组端点处,还有余值,不用一味填充1
// 如果 长度+1 >= 最大值的话,说明最大值依次递减到数组断点处,没有余值了,后面的一部分需要填充1了
// 需要注意不要报 long 了
long cal(int big, int length)
if (length + 1 < big)
int a0 = big - length, an = big - 1;
return (long)(an + a0) * length / 2;
else
int ones = length - (big - 1);
return (long)big * (big - 1) / 2 + ones;
;
以上是关于[M数学] lc1802. 有界数组中指定下标处的最大值(贪心+二分+数学推公式)的主要内容,如果未能解决你的问题,请参考以下文章
C语言试题十六之写删除字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。