📅  最后修改于: 2023-12-03 15:13:12.074000             🧑  作者: Mango
给定一个整数范围 [L, R]
,计算出其中有多少个整数不与范围 [1, R]
中的数字形成任何三角形对。
我们可以暴力地枚举 [L, R]
范围内的每个数字,并统计每个数字与 [1, R]
中数字组成的三角形对数目。但是,这样的时间复杂度为 $O((R-L+1)^3)$,显然无法通过本题。
我们换一种思路。由于我们只关心与 [1, R]
中的数字是否可以组成三角形,因此可以先将 [1, R]
中的数字单独枚举出来,并按照数字大小从小到大排序。
接着,我们枚举 [L, R]
中的每个数字,并将其与 [1, R]
中的数字依次配对。设当前枚举的数字为 $x$,其在 [1, R]
范围内可以与 $i$ 到 $j$($1 \le i < j \le R$)之间的数字形成三角形,那么 $x$ 在 [i, j]$ 范围内的数字都不会与
[1, R]` 中的数字形成三角形对。所以,我们可以找到 $[1, R]$ 中最大的满足 $i \le j \le x+i-1$ 的 $j$ 值,然后将 $[i, j]$ 中的数字数量统计到答案中。
以下是本题的 Python3 代码实现:
def count_triangle_pairs(L: int, R: int) -> int:
nums = list(range(1, R+1))
ans, j = 0, 0
for x in range(L, R+1):
while j < R-1 and nums[j+1] <= x+j:
j += 1
i = max(x, j-R+i+1)
ans += max(0, j-i+1)
return R-L+1-ans
代码解析:
[1, R]
中的数字单独枚举出来,并排序为 nums
数组。[L, R]
中的每个数字,并在 nums
数组中查找最大的 j
值,使得 $i \le j \le x+i-1$。注意,我们可以利用 j
的单调性来优化查找过程。该算法的时间复杂度为 $O((R-L+1) \log R)$,空间复杂度为 $O(R)$。