你可以这样解决你的问题:
您可以使用nth_element 算法O(n)
找到wg中的中位数。O(n)
您遍历所有元素,用一对替换每个元素:<the absolute difference to the median>, <element's value>
。n
你再一次用=做 nth_element k
。应用此算法后,您可以保证k
在新数组中首先具有绝对差的最小元素。你把他们的指数和完成!
另一方面,您的算法使用排序,这使得它O(nlogn)
。
编辑:请求的示例:
设数组为[14, 6, 7, 8, 10, 13, 21, 16, 23]
。
- 在找到中位数的步骤之后,它将被重新排序为:
[8, 7, 9, 10, 13, 16, 23, 14, 21]
,请注意数组未排序,但中位数 (13) 仍然正好在中间。
- 现在让我们做一下让你感到困惑的对替换:我们创建一个新的对数组:
[<abs(14-13), 14>, <abs(6-13), 6>, <abs(7-13), 7>, <abs(8-13), 8>, <abs(10-13), 10>, <abs(13-13), 13>, <abs(21-13), 21>, <abs(16-13), 16>, <abs(23-13), 23>
。这样我们就得到了数组:[<1, 14>, <7, 6>, <6, 7>, <5, 8>, <3, 10>, <0, 13>, <8, 21>, <3, 16>, <10, 23>
- 如果 eg
k
是 4,我们再做一次 nth_element(使用每对的第一个元素进行比较)并获得:[<1, 14>, <3, 16>, <0, 13>, <3, 10>, <8, 21>, <7, 6>, <10, 23>, <6, 7>, <5, 8>]
所以您搜索的数字是前 4 对的第二个元素:14
、16
和13
10