题目:原题链接(中等)
标签:数学、贪心算法、二分查找
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( l o g N ) O(logN) O(logN) | O ( 1 ) O(1) O(1) | 28ms (99.67%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
class Solution:
def maxValue(self, n: int, index: int, maxSum: int) -> int:
# 计算将所有填为1之后剩余的和
maxSum -= n
# 计算最大化坐标到左右的距离
d1 = index
d2 = n - index - 1
if d1 > d2:
d1, d2 = d2, d1
# 计算实现两侧顶满的尖峰所需要的和
peak = (0 + d2) * (d2 + 1) // 2 + ((d2 - d1) + d2) * (d1 + 1) // 2 - d2 # 两个等差数列减被共用的最大值
# 处理剩余可以组成尖峰的情况:尽可能组成尖峰,其余的平均分布
if maxSum >= peak:
# print("距离:", [d1, d2], "剩余:", maxSum, "尖峰需要:", peak)
return 1 + d2 + (maxSum - peak) // n
# print("距离:", [d1, d2], "剩余:", maxSum)
# 不足以组成尖峰的情况:二分查找最大值
left, right = 0, d2
while left < right:
mid = (left + right) // 2
need = (0 + mid) * (mid + 1) // 2 + ((mid - min(mid, d1)) + mid) * (min(mid, d1) + 1) // 2 - mid
# print(left, right, "->", mid, "=", need)
if need <= maxSum:
left = mid + 1
else:
right = mid
return 1 + (left - 1)