1. 程式人生 > >[JAVA程式設計師面試金典]最長遞增子序列

[JAVA程式設計師面試金典]最長遞增子序列

  • 最簡單的思路是動態規劃,陣列array表示輸入的陣列,用一個數組dp記錄子串每一位的最長遞增子串長度,採用公式
    • dp[i]=max(dp[i],dp[j]+1)j<i,array[i]>array[j]
  • 具體分析如下:
    設f(i)表示L中以array[i]為末元素的最長遞增子序列的長度。則有如下的遞推方程:
    這個遞推方程的意思是, 在求以array[i]為末元素的最長遞增子序列時,找到所有序號在L前面且小於array[i]的元素array[j],即j < i 且array[j]< array[i]。如果這樣的元素存在,那麼對所有array[j],都有一個以array[i]為末元素的最長遞增子序列的長度f(j),把其中最大的f(j)選出來,那麼f(i)就等於最大的f(j)加上1,即以array[i]為末元素的最長遞增子序列,等於以使f(j)最大的那個array[j]為末元素的遞增子序列最末再加上array[i];如果這樣的元素不存在,那麼array[i]自身構成一個長度為1的以array[i]為末元素的遞增子序列。

程式碼如下:

package niuke;

/*
 * 最長遞增子序列
 * 17/6/8
 */
public class LIS {
    public static int lis(int[] array){
        int length=array.length;
        if (length ==0)
            return 0;
        int maxCount=0;
        int[] dp=new int[length];
        for(int i =0;i<length;i++){
            dp[i]=1
; for(int j =0;j<i;j++){ if(array[j]<array[i]) dp[i]=dp[i]>dp[j]+1?dp[i]:dp[j]+1; if(maxCount<dp[i]) maxCount=dp[i]; } } return maxCount; } public
static void main(String[] args) { // TODO Auto-generated method stub int[] array={-3,1,3,6,-1,2,-3,4,-5,6,-7,7}; int maxLength=LIS.lis(array); System.out.println("maxLength="+maxLength); } }