【发布时间】:2023-03-07 23:07:02
【问题描述】:
这是一个我花了很多时间思考的家庭作业问题。
假设我有一个未排序的整数数组和一个给定的整数 d。任务是计算涉及掉期大于 d 的反转次数。
例如,给定一个输入数组 (3, 4, 3, 1) 和 d = 2,则此类反转的数量为 1,因为仅计算 4 和 1 之间的反转。其他反演相差小于2。
当然,计算反转次数的一种简单方法是遍历列表的每个数字,并在该数字之前添加元素的数量,该数字更小,差异大于 d。但是,这是一个 n^2 算法。而是需要一个 n \log n 算法。
这里给出了另一种更有效的算法,我们对输入数组执行归并排序,然后直接从那里开始计数。 https://www.geeksforgeeks.org/counting-inversions-subarrays-given-size/
但是,我无法修改它以获得正确的答案。
我的方法是这样的:
在合并排序的“合并”步骤中,如果左子数组的第一项较小,则只需将其添加到已排序的数组中并继续。
否则,我将左子数组中的项数比右子数组的第一项大 d 来增加所需的反转次数。
不过,我仍然无法获得正确答案。
有人可以帮帮我吗?谢谢你。
【问题讨论】:
-
你能提供你已经尝试过的代码吗?它的输出/错误是什么?我也看不到有关您正在使用的编程语言的任何信息。
-
这看起来像一个 NUS CS3230 作业问题。如果这是针对该作业,请注意,在线询问有关作业问题的问题是违反课程政策的。如果这与该课程无关,请忽略此内容
标签: sorting