410小R的数组构造挑战
题解
问题描述
小 R 有一个长度为 n
的数组,数组相邻元素的差值最多为 1
,即 $|a_i − a_{i+1}| ≤ 1$,且数组中的元素都是正整数,即 $a_i ≥ 1$。现在已知数组的长度为 n
,数组的和为 m
,小 R 想知道所有符合条件的数组中,第 $p$ 个位置的元素 $a_p$ 的最大值是多少。
约束条件:
1 ≤ p ≤ n ≤ m
解题思路
二分查找:
- 使用二分查找在范围
[1, m]
内寻找a_p
的最大可能值。 l
表示当前范围的下界,r
表示上界。
- 使用二分查找在范围
辅助函数
calc(i, v)
:- 计算从位置
i
开始,向两边扩展时,每个位置的值如何分配,使得相邻元素差值不超过1
。 - 如果
v > i
,则左侧的元素从v - i + 1
递增到v
,形成等差数列。 - 如果
v ≤ i
,则前v
个元素递增,剩下的元素为1
。 - 可以通过等差数列求和公式$O(1)$计算。
- 计算从位置
实现代码
1 |
|
复杂度分析
时间复杂度:
- 二分查找的时间复杂度为
O(log m)
。每次check
调用的时间复杂度为O(1)
,因为calc
函数的计算是常数时间。因此,总的时间复杂度为O(log m)
。
- 二分查找的时间复杂度为
空间复杂度:
- 使用了常数级别的额外空间,空间复杂度为
O(1)
。
- 使用了常数级别的额外空间,空间复杂度为
410小R的数组构造挑战
https://kongshuilinhua.github.io/2025/01/31/410小R的数组构造挑战/