【发布时间】:2013-09-29 08:45:49
【问题描述】:
如何找到最小正数 K 使得对于数组中的每个项目,从 [-K, K] 中添加或减去一个数字可以导致一个严格升序的数组?
例如:
- 数组为 [10, 2, 20]
- 最小 K 为 5,可能的结果是 [10-5, 2+4, 20]
- k = 4 不行,因为 10-4 == 2+4;数组不能转换为严格的升序
我的猜测如下
定义 f(i, j) = a[i] - a[j] + j-i-1 (要求 i a[j] :所有逆序对)
最小K必须满足条件:
2*K > 最大 f(i,j)
因为如果一对(i,j)不是升序的,a[j]最多只能加K,a[i]最多可以减K,而且a[之间需要留空间给item i] 和 a[j] (因为它是严格的升序), 所以 (a[j] + K) - (a[i] - K) 应该大于 (j-i-1) (它们之间的长度)。
所以 k >= max f(i, j)/2 + 1
问题是我无法证明 k = max f(i, j)/2 + 1 是否可行?
更多线索:
我考虑过找到一种算法来确定给定的 K 是否足够,然后我们 可以使用该算法从可能的最小值开始尝试每个 K 以找到解决方案。
我想出了一个这样的算法:
for i in n->1 # n is array length
if i == n:
add K to a[i] # add the max to the last item won't affect order
else:
# the method is try to make a[i] as big as possible and still < a[i+1]
find a num k1 in [-K, K] to make a[i] to bottom closest to a[i+1]-1
if found:
add k1 to a[i]
else no k1 in [-K, K] can make a[i] < a[i+1]
return false
return true
我也是这样的算法对不对
【问题讨论】:
-
也许这应该放在 cs.SE 或 cstheory.SE 中?
-
也许吧,但我也想如果我们能找到一个算法来确定一个 K 是否可以,那么我们可以从最小值尝试所有可能的 K,直到我们找到一个解决方案
-
例如i = 4和j = 5,它们之间的空格为0,即j - i -1
标签: algorithm