最大递增子序列
題目描述
對(duì)于一個(gè)數(shù)字序列,請(qǐng)?jiān)O(shè)計(jì)一個(gè)復(fù)雜度為O(nlogn)的算法,返回該序列的最長(zhǎng)上升子序列的長(zhǎng)度,這里的子序列定義為這樣一個(gè)序列U1,U2…,其中Ui < Ui+1,且A[Ui] < A[Ui+1]。
給定一個(gè)數(shù)字序列A及序列的長(zhǎng)度n,請(qǐng)返回最長(zhǎng)上升子序列的長(zhǎng)度。
測(cè)試樣例:
[2,1,4,3,1,5,6],7
返回:4
解析:一個(gè)序列有n個(gè)數(shù):a[1],a[2],…,a[n],求出最長(zhǎng)遞增子序列的長(zhǎng)度。
比如說對(duì)于測(cè)試數(shù)據(jù)5,3,4,8,6,7來說:
第1數(shù)字5,dp[0] = 1
第2數(shù)字3,前面沒有比他還小的了,dp[1] = 1
第3數(shù)字4,最長(zhǎng)的遞增子序列就是3,4,dp[2] = 2
第4數(shù)組8,dp[3] = 3
第5數(shù)字6,dp[4] = 3
第6數(shù)字7,dp[5] = 4
思路:就是用dp[i]來記錄A[i]為結(jié)尾的子序列中最大遞增子序列的長(zhǎng)度,對(duì)于每一個(gè)i,令j從1到i - 1遍歷,當(dāng)a[j] < a[i],比較當(dāng)前dp[i]和每一個(gè)dp[j] + 1的大小,將最大值賦給dp[i],然后比較dp[i]與max,如果大于max,就給max賦值。
public int findLongest(int[] A, int n) {int [] dp = new int[n];int max=0;Arrays.fill(dp,1);for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(A[j]<A[i]){dp[i]=Math.max(dp[j]+1,dp[i]);if(dp[i]>=max){max=dp[i];}}}}return max;}總結(jié)
- 上一篇: 《蘑菇街编程题》回文串
- 下一篇: 《美团网编程题》奇数位丢弃