说明
由于相邻整数的差异不能超过 1,因此您首先需要递增结束值 a 和 b 中的较低值,直到它们相等。
a = 3, b = 3, n = 5
[3, _, _, _, 3]
a = 3, b = 5, n = 5
[3, _, _, _, 5]
[3, 4, _, _, 5]
[3, 4, 5, _, 5]
a = 5, b = 3, n = 5
[5, _, _, _, 3]
[5, _, _, 4, 3]
[5, _, 5, 4, 3]
因此,您将为 2 个结束值使用 2 个空格,再加上一个 |a-b| 空格以“均衡”较大结束值处的值:
remain = n - 2 - Math.abs(a - b)
剩下的空格,需要从两边递增,所以只能递增remain / 2次,四舍五入:
incr = (remain + 1) / 2
这意味着可能的最大值是incr 大于最大最终值的数字:
max = Math.max(a, b) + incr;
全部合并:
max = Math.max(a, b) + (n - Math.abs(a - b) - 1) / 2
但是,有两种特殊情况:
如果 n = 2,则结束值之间将没有值,因此n <= 2 无效,因为没有答案。
如果有足够的空间从较低的值到达较高的值,例如a = 3, b = 7, n = 5: [3, 4, 5, 6, 7],这意味着上面的第一步将失败,因为我们无法“均衡”较大最终值的值。在这种特殊情况下,最高非终值比最高终值低 1:
max = Math.max(a, b) - 1
解决方案
所以,总而言之,计算最高非终值的代码是:
static int max(int a, int b, int n) {
int extra = (n - Math.abs(a - b) - 1);
if (n <= 2 || extra < 0)
throw new IllegalArgumentException();
return (extra == 0 ? Math.max(a, b) - 1 : Math.max(a, b) + extra / 2);
}
性能是O(1),因为结果是一个简单的计算,不需要实际构建数组来找到结果。
测试
public static void main(String[] args) {
test(3, 3, 5); // max from question: 5
test(5, 6, 5); // max from question: 7
test(8, 5, 4); // max from question: 7
test(5, 8, 4); // max from question: 7
test(3, 5, 5);
test(5, 3, 5);
test(3, 7, 5);
test(3, 7, 6);
test(3, 7, 7);
test(3, 7, 8);
test(3, 7, 9);
}
static void test(int a, int b, int n) {
System.out.printf("a = %d, b = %d, n = %d: The maximum value is %d. %s%n",
a, b, n, max(a, b, n), Arrays.toString(fill(a, b, n)));
}
static int[] fill(int a, int b, int n) {
int[] v = new int[n];
int i = 0, j = n - 1;
v[i] = a; v[j] = b;
for (; v[i] < v[j]; i++)
v[i + 1] = v[i] + 1;
for (; v[i] > v[j]; j--)
v[j - 1] = v[j] + 1;
for (; i + 1 < j; i++, j--)
v[i + 1] = v[j - 1] = v[i] + 1;
return v;
}
输出
a = 3, b = 3, n = 5: The maximum value is 5. [3, 4, 5, 4, 3]
a = 5, b = 6, n = 5: The maximum value is 7. [5, 6, 7, 7, 6]
a = 8, b = 5, n = 4: The maximum value is 7. [8, 7, 6, 5]
a = 5, b = 8, n = 4: The maximum value is 7. [5, 6, 7, 8]
a = 3, b = 5, n = 5: The maximum value is 6. [3, 4, 5, 6, 5]
a = 5, b = 3, n = 5: The maximum value is 6. [5, 6, 5, 4, 3]
a = 3, b = 7, n = 5: The maximum value is 6. [3, 4, 5, 6, 7]
a = 3, b = 7, n = 6: The maximum value is 7. [3, 4, 5, 6, 7, 7]
a = 3, b = 7, n = 7: The maximum value is 8. [3, 4, 5, 6, 7, 8, 7]
a = 3, b = 7, n = 8: The maximum value is 8. [3, 4, 5, 6, 7, 8, 8, 7]
a = 3, b = 7, n = 9: The maximum value is 9. [3, 4, 5, 6, 7, 8, 9, 8, 7]