Leetcode 673.Number of Longest Increasing Subsequence

原題地址

https://leetcode.com/problems/number-of-longest-increasing-subsequence/description/

題目描述

給定一個(gè)無(wú)序的數(shù)組,找出這個(gè)數(shù)組中包含的最長(zhǎng)遞增子序列的數(shù)目。(不是求最長(zhǎng)遞增子序列的長(zhǎng)度,是問(wèn)有幾個(gè)最長(zhǎng)遞增子序列)

Example
Input: [1,3,5,4,7]
Output: 2
Explanation: The two longest increasing subsequence are [1, 3, 4, 7] and [1, 3, 5, 7].

思路

n為給定數(shù)組長(zhǎng)度,L[ i ]表示以第i個(gè)(0<=i<=n-1)元素結(jié)尾的遞增子序列能達(dá)到的長(zhǎng)度,用動(dòng)態(tài)規(guī)劃的方法求出所有L[ i ],找出其中的最大值longest。
如果longest=1,說(shuō)明每個(gè)單獨(dú)的元素都是一個(gè)最長(zhǎng)遞增子序列,數(shù)組中所有元素都遞減或者相等,此時(shí)直接返回?cái)?shù)組長(zhǎng)度n即可。
count[ i ]表示到達(dá)第i個(gè)元素且長(zhǎng)度為L(zhǎng)[ i ]的子序列的數(shù)目,初始全為0,i=1到n,每次掃描第i個(gè)元素之前的所有元素j,若元素j < 元素i,且L[ j ]+1=L[ i ],就增加count[ i ]的值:若count[ j ] 不為0,則加上count[ j ]的值;若count[ j ]=0則加1。
最后遍歷求出的count數(shù)組,將L[ i ]=longest 的元素 i 對(duì)應(yīng)的count[ i ]求和就是最后結(jié)果。
復(fù)雜度為 O(n^2)

代碼

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        int L[n],count[n];
        int longest = 0;
        int result = 0;
        for (int j = 0; j < n; j++) {
            L[j] = 1;
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j] && L[i] <= L[j] + 1) {
                    L[i] = L[j] + 1;
                }
            }
            if (longest < L[i]) {
                longest = L[i];
            }
        }

        if (longest == 1) {
            result = nums.size();
        } else {
            memset(count, 0, sizeof(L[0])*n);
            for (int i = 1; i < n; i++) {
                for (int j = 0; j < i; j++) {
                    if (nums[i] > nums[j] && L[i] == L[j] + 1 ) {
                        if (count[j] == 0) {
                            count[i] += 1;
                        } else {
                            count[i] += count[j];
                        }
                    }
                }
            }
            for (int i = 0; i < n; i++) {
                if (L[i] == longest) {
                    result += count[i];
                }
            }
        }
        return result;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容