您的位置:首页 > 产品设计 > UI/UE

Leetcode 300. Longest Increasing Subsequence 最长的递增子序列 dp

2020-04-21 23:24 701 查看

300. Longest Increasing Subsequence

给出一个整数构成的数组,找到最长的递增子序列的长度。

Given an unsorted array of integers, find the length of longest increasing subsequence.

Example:

Input: [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.

Note:

  • There may be more than one LIS combination, it is only necessary for you to return the length.
  • Your algorithm should run in O(n2) complexity.

Follow up: Could you improve it to O(n log n) time complexity?

解法:利用一个

dp
数组,其中
dp[i]
代表使用
i
个元素的最长递增子序列,
dp[0]=1
,更新
dp[i]
采用如下的方法:

j
0
i-1
迭代,如果数组中位置
j
的元素比位置
i
的元素小,那么在位置
i
可以通过计算到
j
的递增子序列长度加 1 得到一个更长的递增子序列。

最后遍历

dp
数组,找到一个以某一个元素结尾的最长递增子序列的长度。

int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if (n == 0) return 0;
vector<int> dp(n + 1, 1);
dp[0] = 1;
int m = 1;
for (int i = 1; i < n; i ++){
for (int j = 0; j < i; j ++){
if (nums[j] < nums[i])
dp[i] = max(dp[i], dp[j] + 1);
}
if (dp[i] > m) m = dp[i];
}
return m;
}
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
m0_37169880 发布了21 篇原创文章 · 获赞 1 · 访问量 643 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: