【发布时间】:2018-07-09 13:36:52
【问题描述】:
我们得到一个未排序的整数数组A(允许重复),其大小N 可能很大。我们可以统计索引为i < j的对的数量,其中A[i] < A[j],我们称之为X。
我们可以从数组中更改最大一个元素,其成本等于绝对值的差值(例如,如果我们将索引k 上的元素替换为新数字K,则成本Y 是@ 987654329@)。
我们只能用数组中的其他元素替换这个元素。
我们希望找到X + Y 的最小可能值。
一些例子:
- [1,2,2] 应返回 1(将 1 更改为 2,使数组变为 [2,2,2])
- [2,2,3] 应该返回 1(将 3 改为 2)
- [2,1,1] 应该返回 0(因为不需要更改)
- [1,2,3,4] 应该返回 6(这已经是可能的最小值)
- [4,4,5,5] 应该返回 3(这可以通过将前 4 更改为 5 或将后 5 更改为 4 来实现)
可以通过简单的O(n²) 解决方案找到对的数量,在 Python 中:
def calc_x(arr):
n = len(arr)
cnt = 0
for i in range(n):
for j in range(i+1, n):
if arr[j] > arr[i]:
cnt += 1
return cnt
蛮力解决方案很容易写成例如:
def f(arr):
best_val = calc_x(arr)
used = set(arr)
for i, v in enumerate(arr):
for replacement in used:
if replacement == v:
continue
arr2 = arr[0:i] + replacement + arr[i:]
y = abs(replacement - v)
x = calc_x(arr2)
best_val = min(best_val, x + y)
return best_val
我们可以在O(n*log(n)) 中为每个元素计算其右侧大于自身的项目数,例如使用 AVL 树或合并排序的一些变体。
但是,我们仍然需要寻找要更改的元素以及可以实现哪些改进。
这是作为一个面试问题给出的,我想要一些关于如何有效解决这个问题(数据结构或算法)的提示或见解。
【问题讨论】:
标签: arrays algorithm data-structures