[算法]需要排序的最短子數組長度


題目:

給定一個無序數組,求出需要排序的最短子數組的長度。

例如: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;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM