版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Allenlzcoder/article/details/81417420
LeetCode 300. Longest Increasing Subsequence
Solution1:我的答案
暴力搜索,时间复杂度
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size(), res = 1;
if (!n) return 0;
if (n == 1) return 1;
//注意:这种对数组初始化的方式只会初始化第一个为1
int dp[n] = {1};
for (int i = 1; i < n; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
res = max(dp[i], res);
}
return res;
}
};
Solution2:
时间复杂度
参考链接:[1]http://www.cnblogs.com/grandyang/p/4938187.html
[2]https://leetcode.com/problems/longest-increasing-subsequence/discuss/148060/Easy-To-Understand-Python-Code-With-Clear-Explanation-O(nlogn)
一个有点奇妙的算法~
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp;
for (int i = 0; i < nums.size(); ++i) {
int left = 0, right = dp.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (dp[mid] < nums[i]) left = mid + 1;
else right = mid;
}
if (right >= dp.size()) dp.push_back(nums[i]);
else dp[right] = nums[i];
}
return dp.size();
}
};