輸入描述:
第一行,一個正整數n(1<=n<=100),序列長度;接下來n個小於1000的正整數,表示一個遞增序列。
輸出描述:
輸出答案。
輸入
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;
}
}