題目:
對於一個無序數組A,請設計一個算法,求出需要排序的最短子數組的長度。
給定一個整數數組A及它的大小n,請返回最短子數組的長度。
測試樣例:
[1,5,3,4,2,6,7],7
結果:4
思路:在O(n)的時間複雜度中可以完成這道題。當然也有利用快排一次然後比較兩個不同的個數來求長度。如果使用快排時間複雜度是O(nlogn)。
對於O(n)的解法,舉個例子[1,5,3,4,2,6,7] 我們需要排序的範圍是5到2之間,這裏我們可以找出5和2的特徵,首先分析2,2是從左向右遍歷最後一個小於他的左前部分最大值的的數字。然後分析5,5是從右向左遍歷最後一個大於他右前部分最小值的數字。通過上面的分析我們可以得到結論,從而找出這兩個的位置然後相減在加上一就得到了我們的答案。代碼如下:
/**
* 最短排序
* 對於一個無序數組A,請設計一個算法,求出需要排序的最短子數組的長度。
給定一個整數數組A及它的大小n,請返回最短子數組的長度。
[1,5,3,4,2,6,7],7
返回:4
* Created by lizhaoz on 2016/5/3.
*/
public class findshort {
public static int findShortest(int[] A, int n) {
int k = -1;
int max = A[0];
for(int i=1;i<n;i++){
if(max > A[i])
k = i;
else
max = A[i];
}
if(k==-1)return 0;
int m = -1;
int min = A[n-1];
for(int i=n-2;i>=0;i--){
if(min < A[i])
m = i;
else
min = A[i];
}
System.out.println(k+" "+m);
return k-m+1;
}
public static void main(String[] args) {
findShortest(new int[]{1,5,3,4,2,6,7},7);
}
}