題目:
給定一個無序數組,求出需要排序的最短子數組的長度。
例如:arr={1,5,3,4,2,6,7}返回4,因為只有[5,3,4,2]需要排序。
思路:
解決這個問題可以在時間復雜度為O(N)、額外空間復雜度為O(1)完成。
初始化變量noMinIndex=-1,從右向左遍歷,便利的過程記錄右側出現過的數的最小值,記為min。假設當前數為arr[i],如果arr[i]>min,說明如果要整體有序,min值必然會移到arr[i]的左邊。用noMinIndex記錄最左邊出現這種情況的位置。如果遍歷完成后,noMinIndex的值依然為-1,說明從右向左始終不升序,原數組本來就有序,直接返回0,即完全不需要排序。
接下來從左向右遍歷,遍歷的過程記錄左側出現過的數的最大值。記為max。假設當前數為arr[i],如果arr[i]<max,說明如果排序,max的值必然會挪到arr[i]的右邊。用變量moMaxindex記錄最右邊出現這種情況的位置。
遍歷完后,arr[noMinIndex…noMaxIndex]是真正需要排序的部分。返回它的長度即可。
程序:
public static int getMinLength(int[] arr) { if (arr == null || arr.length < 2) { return 0; } int min = arr[arr.length - 1]; int noMinIndex = -1; for (int i = arr.length - 2; i != -1; i--) { if (arr[i] > min) { noMinIndex = i; } else { min = Math.min(min, arr[i]); } } if (noMinIndex == -1) { return 0; } int max = arr[0]; int noMaxIndex = -1; for (int i = 1; i != arr.length; i++) { if (arr[i] < max) { noMaxIndex = i; } else { max = Math.max(max, arr[i]); } } return noMaxIndex - noMinIndex + 1; }