python - 查找对 (i,j) 的数量,使得 i < j 且 A[i] >= 2A[j]
问题描述
问题是找到一种算法(最好使用分治法)来计算 i < j 且 A[i] >= 2*A[j] 的数组中所有有序对 (i,j) 的数量。
我已经知道 O(²) 方式,但我想要一个更有效的算法或日志顺序。
这是我在 python 中的代码:
ans = 0
def recursion(arr):
global ans
if len(arr) > 1:
left = arr[:len(arr)//2]
right = arr[len(arr)//2:]
recursion(left)
recursion(right)
for i in left:
for j in right:
if i >= 2*j:
ans += 1
a = list(map(int, input().split()))
recursion(a)
print(ans)
样本输入:[8, 1, 9 ,4, 1]
预期输出:6
解决方案
通过对每个数组进行一半排序并调整归并排序/反转计数的逻辑,可以使代码的征服部分更有效地工作。下面的 Python 代码利用 Timsort 来产生线性时间排序的合并。
顺便说一句,我在给定的输入中计算了 6 个这样的对:(8, 1), (8, 4), (8, 1), (9, 4), (9, 1), (4, 1)
.
def merge(left, right):
return sorted(left + right)
def recursion(arr):
if len(arr) <= 1:
return 0, arr
half = len(arr) // 2
left_ans, left = recursion(arr[:half])
right_ans, right = recursion(arr[half:])
cross_ans = 0
j = 0
for i in range(len(left)):
while j < len(right) and left[i] >= 2 * right[j]:
j += 1
cross_ans += j
return left_ans + cross_ans + right_ans, merge(left, right)
print(recursion([8, 1, 9, 4, 1])[0])
推荐阅读
- html - 渲染条件输入给出错误
- python - Django:在查询集中相乘
- javascript - Nodejs 从我的 ajax 前端接收多个请求
- azure-web-app-service - 在 Azure 应用服务中运行的 Kentico 站点上出现 502 - Bad Gateway 错误
- javascript - 在一定数量的人点击该链接后自动更改按钮链接
- substrate - decl_storage 中 pub 的用途是什么?
- azure - 在 Azure Pipelines 上将 Packer 作为构建不可变映像任务的一部分运行会返回 ResourceNotFound 错误
- python - 在 Python 中按这些值搜索时,如何有效地从字典中提取值列表?
- python - 尽管有阴影或背景的颜色,是否有一种通用的方法来检测 opencv 上的打火机?
- python - 如何在基于类的视图中发送上下文