編程題-最短排序

題目: 
對於一個無序數組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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章