300. 最长上升子序列
1.纯dp:
注意:dp[i]
保存的是以nums[i]
结尾的最长子序列,不是前i
个元素中的最长子序列,所以还要用一个maxLIS
来记录最长的。
class Solution {
public:
int lengthOfLIS(vector<int> &nums) {
if (nums.size() == 0)
return 0;
vector<int> dp(nums.size(), 0);
dp[0] = 1;
int maxLIS = 1;
for (int i = 1; i < nums.size(); i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j] && dp[i] < dp[j] + 1)
dp[i] = dp[j] + 1;
maxLIS = max(dp[i], maxLIS);
}
}
return maxLIS;
}
};
2.使用栈+二分优化:
-
nums[i]
大于栈中最后一个元素,就push到栈中 -
nums[i]
小于栈中最后一个元素,就遍历栈,用nums[i]
替换第一个大于他的栈元素,这一步可以使用二分查找优化到
class Solution {
public:
int binary_search(int num, vector<int> &st) {
int low = 0, high = st.size() - 1, mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (st[mid] == num)
return mid;
else if (st[mid] > num)
high = mid - 1;
else if (st[mid] < num)
low = mid + 1;
}
return low;
}
int lengthOfLIS(vector<int> &nums) {
vector<int> st;
if (nums.size() == 0)
return 0;
st.push_back(nums[0]);
for (int i = 1; i < nums.size(); i++) {
if (nums[i] > st.back())
st.push_back(nums[i]);
else {
int pos = binary_search(nums[i], st);
st[pos] = nums[i];
}
}
return st.size();
}
};