[编程题] 最大间隔
给定一个递增序列,a
1 <a
2 <...<a
n 。定义这个序列的最大间隔为d=max{a
i+1 - a
i }(1≤i<n),现在要从a
2 ,a
3 ..a
n-1 中删除一个元素。问剩余序列的最大间隔最小是多少?
输入描述:
第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列。
输出描述:
输出答案。
示例1
输入
5 1 2 3 7 8
输出
4
详细注释版:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] a;
while (sc.hasNext()) {
int n = sc.nextInt();
a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int maxDisMin = findMin(n, a);
System.out.println(maxDisMin);
}
}
/**
* 注意a[i]范围为1-1000,并且a的元素递增
* 查找最大间隔中的最小值
* O(n)时间复杂度,一趟for循环。 算法思想,删除一个数后,这个数的前后两个间隔就会合为一个间隔,最大间隔d可能变大。
* 要找最小的d值,只要找到连续两个间隔的和(a[i+1]-a[i-1])最小的值,把它与删除前的最大间隔比较,
* 如果没有超过原先的d值,那么最大间隔不变,如果超过了,这个就是新的d值。
*
* @param n
* 元素个数
* @param a
* 数组a
* @return
*/
public static int findMin(int n, int[] a) {
// 初始化最大间隔,
int maxDis = 0;
// 初始化最大间隔最小值
int maxDisMin = a[n - 1] - a[0];
// 找出此序列未删除任何元素之前的最大间隔
for (int j = 0; j < n - 1; j++) {
if (a[j + 1] - a[j] > maxDis) {
maxDis = a[j + 1] - a[j];
}
}
// 遍历删除元素a[i](1<=i<=n-2)
for (int i = 1; i < n - 1; i++) {
// 初始化删除后最大间隔maxDisDel为未删除的最大间隔maxDis
// 暂存原先最大间隔
int maxDisDel = maxDis;
if (a[i + 1] - a[i - 1] > maxDis) {
// 如果a[i]前后两元素之差大于maxDis,更新maxDisDel
maxDisDel = a[i + 1] - a[i - 1];
}
if (maxDisDel < maxDisMin) {
// 如果最大间隔小于maxDisMin,更新maxDisMin
maxDisMin = maxDisDel;
}
}
return maxDisMin;
}
}