如何解决找到对 (i,j) 的数量,使得 i < j 和 A[i] >= 2A[j]
问题是找到一种算法(最好使用分治法)来计算数组中所有有序对 (i,j) 的数量,其中 i = 2*A[ j].
我已经知道一个 O(?²) 的方法,但我想要一个更有效的算法,以 ? 或 ?log? 顺序。
这是我的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),(9,(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])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。