【Leetcode】1802. 有界数组中指定下标处的最大值——1929
题目
1802. 有界数组中指定下标处的最大值
给你三个正整数
n、index和maxSum。你需要构造一个同时满足下述所有条件的数组nums(下标 从0开始 计数):
nums.length == nnums[i]是 正整数 ,其中0 <= i < nabs(nums[i] - nums[i+1]) <= 1,其中0 <= i < n-1nums中所有元素之和不超过maxSumnums[index]的值被最大化
返回你所构造的数组中的nums[index]。注意:
abs(x)等于x的前提是x >= 0;否则,abs(x)等于-x。
- \(1\leq n\leq maxSum\leq 10^{9}\)
- \(0\leq index< n\)
思路
给定index位置最大高度
首先需要分析的是,在同样的满足所有条件的情况下,尽可能少的元素和总是不弱于元素和更大的结果。因为后者总是更优于满足条件。
因此如果我们已经得到了index位置的最大高度,那么其余位置的分配就是在index左右两侧分别每隔一个就减少1,直到得到1或者到达数组的两侧。
二分法
可以预见的是,如果给定的index位置的最大高度越大,其元素和就越大,即成正比的关系。因此可以结合上述的分析结果,使用二分法进行求解
class Solution:
def maxValue(self, n: int, index: int, maxSum: int) -> int:
def check(x):
l = max(index - x + 1, 0) # 左侧递减到达的位置
res = max(l ,0) + (x + x - index + l) * (index - l + 1) // 2
r = min(index + x - 1, n - 1) # 右侧递减到达的位置
res += max(n-1-r,0) + (x + x + index - r) * (r - index + 1) // 2
return res-x > maxSum
return bisect_right(range(1, maxSum+1), False, key=check)

浙公网安备 33010602011771号