您的位置:首页 > 其它

leetcode 300. 最长上升子序列

2020-03-15 18:22 666 查看

leetcode 300. 最长上升子序列

题目详情

题目链接
给定一个无序的整数数组,找到其中最长上升子序列的长度。

  • 示例:
    输入: [10,9,2,5,3,7,101,18]
    输出: 4
    解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
  • 说明:
  1. 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
  2. 你算法的时间复杂度应该为 O(n2) 。
  • 进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

我的代码

class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
if (len == 0) {
return 0;
}
if (len == 1) {
return 1;
}
vector<int> res(len, 1);
for (int i = 1; i < len; ++i) {
for (int j = 0; j <=i; ++j) {
if (nums[i] > nums[j]) {
res[i] = max(res[i], res[j] + 1);
}
}
}
int r = 1;
for (int num: res) {
r = max(num, r);
}
return r;
}
};

我的成绩

执行结果:通过
执行用时 :48 ms, 在所有 C++ 提交中击败了62.64%的用户
内存消耗 :9.3 MB, 在所有 C++ 提交中击败了5.07%的用户

一些想法

本题,我并没有想到解法,最后参考了官方的答案中的动态规划,参考链接

执行用时为 0 ms 的范例

class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
if(n == 0)
return 0;
vector<int> v;
v.push_back(nums[0]);
for(int i = 1; i < n; i++) {
if(nums[i] > v.back()) {
v.push_back(nums[i]);
} else {
*lower_bound(v.begin(), v.end(), nums[i]) = nums[i];
}
}
return v.size();
}
};

思考

  1. lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个不小于value 的值。该函数为C++ STL内的函数。
  2. 初看范例毫无逻辑,但仔细一想,范例做法确实可以,实在佩服。以后做有序序列题,可以考虑使用lower_bound()函数。
  • 点赞
  • 收藏
  • 分享
  • 文章举报
摸鱼混子 发布了6 篇原创文章 · 获赞 0 · 访问量 39 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: