[編程題] 最大間隔 java 蘑菇街2016研發工程師在線編程題


[編程題] 最大間隔
給定一個遞增序列,a1 <a2 <...<an 。定義這個序列的最大間隔爲d=max{ai+1 - ai }(1≤i<n),現在要從a2 ,a3 ..an-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;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章