如何找到最小正数 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] + ji-1 (要求 i < j 和 a[i] > a[j] :所有逆序对)
最小 K 必须满足条件:
2*K > 最大 f(i,j)
因为如果一对 (i, j) 不是升序排列,a[j] 最多只能加 K,a[i] 最多可以减去 K,而且 a[i] 和a[j] (因为它是严格的升序),所以 (a[j] + K) - (a[i] - K) 应该大于 (ji-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
我也是这样的算法是对还是错