LIS最長遞增子串行的長度 個數

2021-10-21 02:07:05 字數 1562 閱讀 5167

給你乙個整數陣列 nums ,找到其中最長嚴格遞增子串行的長度。

子串行是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子串行。

示例 1:

輸入:nums = [10,9,2,5,3,7,101,18]

輸出:4

解釋:最長遞增子串行是 [2,3,7,101],因此長度為 4 。

示例 2:

輸入:nums = [0,1,0,3,2,3]

輸出:4

dpdp,

初始化dp陣列,

找固定狀態

找狀態跳轉的關係

如果nums中當前值比nums陣列中前乙個值大,那麼dp陣列中的當前值是:dp陣列中前乙個值+1,和dp當前的初始值的最大值。

如果最後返回return dp[n-1];

就有情況是錯的,所以找乙個res一直儲存最後的結果

複習之前做過的題,思路

方法1,時間複雜度:平方:

class

solution

} res=

max(res,dp[i]);

// 結果

}return res;}}

;

方法2:時間複雜度更低:

int

lengthoflis

(vector<

int>

& nums)

vector<

int>

d(n +1,

0); d[len]

= nums[0]

;for

(int i =

1; i < n;

++i)

else

else

} d[pos +1]

= nums[i];}

}return len;

}

給定乙個未排序的整數陣列,找到最長遞增子串行的個數。

示例 1:

輸入: [1,3,5,4,7]

輸出: 2

解釋: 有兩個最長遞增子串行,分別是 [1, 3, 4, 7] 和[1, 3, 5, 7]。

示例 2:

輸入: [2,2,2,2,2]

輸出: 5

解釋: 最長遞增子串行的長度是1,並且存在5個子序列的長度為1,因此輸出5。

注意: 給定的陣列長度不超過 2000 並且結果一定是32位有符號整數。

在原來的基礎上,初始化dp陣列的時候,做乙個統計cnt,當前元素i,為最長遞增子串行的最後乙個元素時,最長遞增子串行的個數。

class

solution

else

if(dp[j]+1

== dp[i])}

}if(dp[i]

> maxlen)

else

if(dp[i]

== maxlen)

}return res;}}

;

最長遞增子串行 LIS

對於這個問題,最直觀的dp方法是cnt i 表示以height i 結束的最長遞增子串行的元素的個數,遞迴方程是cnt i max for max i 0 i求出整個數列的最長遞增子串行的長度 if b i max max b i cout return 0 顯然,這種方法的時間複雜度仍為o n 2...

最長遞增子串行 LIS

給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.這個問題可以轉換為最長公共子串行問題。如例子中的陣列a,則我們排序該陣列得到陣列a 然後找出陣列a和a 的最長公共子串行即可。顯然這裡最長公共子串行...

最長遞增子串行(LIS)

300.longest increasing subsequence good 給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行 不一定連續,當時先後順序不能亂 更正式的定義是 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1。比如陣列a 為,那麼最長遞增子串行為。以...