【算法】——查找:最長連續遞增子序列(部分有序)


找出在數組中的最長遞增子序列

數組:1,9,2,5,7,3,4,6,8,0

最長遞增子序列:3,4,6,8

思路:

遇到大的就移動,如果在某一個位置變小了就計算這一段的長度(雙指針)
不停更新最大的length
一個在前線,一個在后面作為游標,最后結束了看一下戰線拉了有多長

public class 最長遞增子序列 {

    public static void main(String[] args) {
        int []arr = {0,1,0,1,2,3,1,2,0,1,2,3,4,5,1};
        getLargestLen(arr);

    }

    private static void getLargestLen(int[] arr) {
        int begin=0;     // 最長遞增子序列長度的開始位
        int maxLen = 1; // 最長遞增子序列長度
        int k = 1;  // 遞增子序列長度
        for (int end = 1; end < arr.length; end++) {
            if(arr[end]>=arr[end-1]){
                k++;
            } else {
                k=1;
            }
            if (k>=maxLen) {
                maxLen = k;
                begin = end-maxLen+1;
            }
        }
        System.out.print("最長連續遞增子序列為:");
        for(int i = begin;i<begin+maxLen;i++)
            System.out.print(arr[i] + "   ");
    }

}

上述代碼的主要思想是

因為需要找到連續遞增的始末位置,所以需要一個begin來記錄需要輸入最長連續遞增序列的開始位置

以及end來記錄需要輸入最長連續遞增序列的最后位置,又因為不論是否在中間隔斷不再遞增,end一直需要向后移動,所以可以用end作為循環for(int end=0; end<arr.length; end++);

考慮到如果下一個數不再比上一個數大,那么起始位置應該改變而不是再進行遞增,我們首先可以在當變小的時候,把記錄的該次的遞增序列長度的計數器k變為1(重新開始新的一次記錄),當然在k已經變成1的情況下,上一次記錄的最長遞增序列長度不需要再等於k,而且begin也就是上次保存的位置

通過在循環中不斷地讓記錄的該段連續遞增序列的長度k和記錄的最長長度進行比較,來更新最長的長度以及更新此刻的起始位置

關於起始位置,是在仍然滿足下一個比上一個數大的情況下的話,begin的位置就不會改變,通過思考可以得到一個連續遞增序列的起始位置應該是末位置減去記錄的該段目前的最長位置+1得到

注意最后輸出的時候起始點就是begin,但是末位置不再是end,因為這個是在循環的范圍中有效,所以末位置應該hi用記錄下來的起始位置加上記錄的最長長度構成

 


免責聲明!

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



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