【Leetcode】1802. 有界数组中指定下标处的最大值——1929

题目

1802. 有界数组中指定下标处的最大值

给你三个正整数 nindexmaxSum 。你需要构造一个同时满足下述所有条件的数组 nums(下标 从0开始 计数):

  • nums.length == n
  • nums[i]正整数 ,其中 0 <= i < n
  • abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1
  • nums 中所有元素之和不超过 maxSum
  • nums[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)
posted @ 2024-10-20 21:29  TICSMC  阅读(5)  评论(0)    收藏  举报