本文讲述了通过JAVA解决 AI刷题 462.桥梁最高高度
462.桥梁最高高度
问题描述:
牛妹需要用 n 根桥柱搭建一座桥,第一根桥柱和最后一根桥柱的高度已经确定,分别为 a 和 b。为了保证桥梁的稳固性,相邻桥柱的高度差不能超过 1。牛妹想知道,在保证稳固性的前提下,桥梁中最高的桥柱能有多高。你需要帮助牛妹计算桥梁最高的桥柱的高度。
题目要求:
题目所给的函数声明为:public static int solution(int n, int a, int b),即该函数接收桥住个数n,两端的高度a,b;类型均为int。返回结果为桥梁的最大高度,类型为int。
题目样例:
样例1:
输入:
n = 2 ,a = 1 ,b = 1
输出:1
样例2:
输入:
n = 3 ,a = 1 ,b = 1
输出:2
样例3:
输入:
n = 5 ,a = 3 ,b = 2
输出:4
样例4:
输入:
n = 5 ,a = 1 ,b = 100
输出:-1
样例5:
输入:
n = 4 ,a = 1 ,b = 4
输出:4
解析:
判断特殊情况:
题目中给了两端的高度和使用的桥柱数目,显然,当相邻的两个桥柱的高度差不大于1时,会存在一种情况使得所给参数不足以符合题意。即当所有的桥柱都不与其他任何桥柱相同时,仍不能弥补a,b之间的差距。
显然,a,b之间的高度差为Math.abs(a - b),当恰好使得桥可以被稳固搭建时,需要Math.abs(a - b) - 1根桥柱。而由题意得,去除a,b后,剩余的桥柱数目为n - 2根。所以,当满足Math.abs(a - b) - 1 <= n - 2时,桥可以被稳固建立,反之则不能建立桥梁。
因此,对于不可搭建桥梁的特殊情况,有代码:
if (Math.abs(a - b) > n - 1) {
return -1;
}
假设两端相等:
对于复杂的问题,可以先通过减少可选的条件简化问题。假设桥梁两端的桥柱高度相同,为了让桥柱达到最高,一定是桥梁的前半段不断增高,在后半段不断降低。这两段路程显然是对称的。
当剩余桥柱数目n为偶数时,由于两段路程对称,桥柱升高的高度就是n / 2,最高处的高度为a + n / 2;
当剩余桥柱数目n为奇数时,显然有n - 1个桥柱是对称的,最中间的桥柱在增高1,所以桥柱升高的高度为(n - 1) / 2 + 1,最高处的高度为a + (n - 1) / 2 + 1。
统一结果式
在上节中,需要判断剩余桥柱数目的奇偶性质,为了节省效率,可通过int类型在运算除法时丢失精度的特点将两种不同的结果式子统一为(n + 1) / 2。
当n为偶数时,由于int类型,使得n / 2与(n + 1) / 2的结果相同;而当n为奇数时,(n + 1) / 2会比(n - 1) / 2多1,刚好弥补中间最高的桥柱。
所以最终的返回值为a + (n + 1) / 2。
原始问题:
有了刚刚的经验,当两端桥柱的高度不同时,只需要先消耗一部分桥柱从低处搭建,使得两端桥柱相等就好。加上a,b两根桥柱,剩余的桥柱数目为n - 2 - Math.abs(a - b),此时就可以视作为两端相等的问题,同时,两端的高度
应为a,b两者中较大的那个。
具体代码:
结合以上内容可以得到该题目的最终代码为:
public static int solution(int n, int a, int b) {
if (Math.abs(a - b) > n - 1) {
return -1;
}
int m = a > b ? a : b;
n = n - 2 - Math.abs(a - b);
return m + (n + 1) / 2;
}