Description
给定一个数组找最长递增子序列长度。
Input
一个vector数组例如:[10,9,2,5,3,7,101,18]
Output
4
Solution
LIS板题。
- 注意dp数组初始化为1。
- 状态转移: d p [ i ] = m a x ( d p [ i ] , d p [ j ] + 1 ) ( 0 < = j < = i ) dp[i]=max(dp[i],dp[j]+1) \ (0<=j<=i) dp[i]=max(dp[i],dp[j]+1) (0<=j<=i)
class Solution:
def lengthOfLIS(self, nums) -> int:
if len(nums) == 0:
return 0
dp = [1 for _ in range(len(nums))]
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j]+1)
res = 0
for index in range(len(nums)):
res = max(res, dp[index])
return res
class Solution
{
public:
int lengthOfLIS(vector<int> &nums)
{
if (nums.size() == 0)
return 0;
//dp初始化为1!!!
vector<int> dp(nums.size(), 1);
for (int i = 1; i < nums.size(); ++i)
{
// 每次外部循环,确定以当前位置为末尾元素的最长子序列;
for (int j = 0; j < i; ++j)
// 通过遍历 j 实现对 dp[i] 的更新
if (nums[j] < nums[i])
dp[i] = max(dp[i], 1 + dp[j]);
}
int res = 0;
for (int i = 0; i < nums.size(); i++)
res = max(ans, dp[i]);
return res;
}
};