最长递增子序列
| #include <vector> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| int lengthOfLIS(vector<int> &nums) { |
| int n = nums.size(); |
| |
| vector<int> dp(n); |
| int res = 0; |
| for (int i = 0; i < n; ++i) { |
| dp[i] = 1; |
| for (int j = 0; j < i; ++j) { |
| if (nums[j] < nums[i]) |
| dp[i] = max(dp[i], dp[j] + 1); |
| } |
| res = max(res, dp[i]); |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| int binarySearch(vector<int> &ends, int len, int target) { |
| int left = 0; |
| int right = len - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (ends[mid] >= target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return left; |
| } |
| |
| |
| int lengthOfLIS(vector<int> &nums) { |
| int n = nums.size(); |
| |
| |
| vector<int> ends(n); |
| |
| int len = 0; |
| for (int i = 0, pos; i < n; ++i) { |
| pos = binarySearch(ends, len, nums[i]); |
| if (pos == len) { |
| |
| ends[len++] = nums[i]; |
| } else { |
| |
| ends[pos] = nums[i]; |
| } |
| } |
| return len; |
| } |
| }; |
| #include <vector> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| int binarySearch(vector<int> &ends, int len, int target) { |
| int left = 0; |
| int right = len - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (ends[mid] > target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return left; |
| } |
| |
| |
| int lengthOfLIS(vector<int> &nums) { |
| int n = nums.size(); |
| |
| |
| vector<int> ends(n); |
| |
| int len = 0; |
| for (int i = 0, pos; i < n; ++i) { |
| pos = binarySearch(ends, len, nums[i]); |
| if (pos == len) { |
| |
| ends[len++] = nums[i]; |
| } else { |
| |
| ends[pos] = nums[i]; |
| } |
| } |
| return len; |
| } |
| }; |
| #include <vector> |
| #include <algorithm> |
| #include <iostream> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| int binarySearch(vector<int> &ends, int len, int target) { |
| int left = 0; |
| int right = len - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (ends[mid] >= target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return left; |
| } |
| |
| int maxEnvelopes(vector<vector<int>> &envelopes) { |
| |
| sort(begin(envelopes), end(envelopes), |
| [](vector<int> &v1, vector<int> &v2) { |
| return v1[0] == v2[0] ? v1[1] > v2[1] : v1[0] < v2[0]; |
| }); |
| |
| int n = envelopes.size(); |
| |
| |
| vector<int> ends(n); |
| |
| int len = 0; |
| |
| for (int i = 0, pos; i < n; ++i) { |
| int target = envelopes[i][1]; |
| pos = binarySearch(ends, len, target); |
| if (pos == len) { |
| |
| ends[len++] = target; |
| } else { |
| |
| ends[pos] = target; |
| } |
| } |
| |
| return len; |
| } |
| }; |
| #include <vector> |
| #include <algorithm> |
| #include <iostream> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| int binarySearch(vector<int> &ends, int len, int target) { |
| int left = 0; |
| int right = len - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (ends[mid] > target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return left; |
| } |
| |
| |
| int lengthOfLIS(vector<int> &nums) { |
| int n = nums.size(); |
| |
| |
| vector<int> ends(n); |
| |
| int len = 0; |
| for (int i = 0, pos; i < n; ++i) { |
| pos = binarySearch(ends, len, nums[i]); |
| if (pos == len) { |
| |
| ends[len++] = nums[i]; |
| } else { |
| |
| ends[pos] = nums[i]; |
| } |
| } |
| return len; |
| } |
| |
| int kIncreasing(vector<int> &arr, int k) { |
| int n = arr.size(); |
| int res = 0; |
| |
| for (int i = 0; i < k; ++i) { |
| vector<int> temp; |
| for (int j = i; j < n; j += k) |
| temp.emplace_back(arr[j]); |
| |
| res += temp.size() - lengthOfLIS(temp); |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| #include <algorithm> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int binarySearch(vector<int> &ends, int len, int target) { |
| int left = 0; |
| int right = len - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (ends[mid] >= target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return left; |
| } |
| |
| int findLongestChain(vector<vector<int>> &pairs) { |
| |
| sort(begin(pairs), end(pairs), |
| [](vector<int> &v1, vector<int> &v2) { |
| return v1[0] < v2[0]; |
| }); |
| int n = pairs.size(); |
| vector<int> ends(n); |
| int len = 0; |
| for (int i = 0, pos; i < n; ++i) { |
| |
| pos = binarySearch(ends, len, pairs[i][0]); |
| if (pos == len) { |
| |
| ends[len++] = pairs[i][1]; |
| } else { |
| |
| ends[pos] = min(ends[pos], pairs[i][1]); |
| } |
| } |
| return len; |
| } |
| }; |
| #include <vector> |
| #include <algorithm> |
| #include <iostream> |
| |
| using namespace std; |
| |
| int n, k; |
| |
| |
| |
| int binarySearch1(vector<int> &ends, int len, int target) { |
| int left = 0; |
| int right = len - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (ends[mid] < target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return left; |
| } |
| |
| |
| |
| int binarySearch2(vector<int> &ends, int len, int target) { |
| int left = 0; |
| int right = len - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + ((right - left) >> 1); |
| if (ends[mid] > target) { |
| right = mid - 1; |
| } else { |
| left = mid + 1; |
| } |
| } |
| return left; |
| } |
| |
| |
| |
| |
| vector<int> getRightMaxLen(vector<int> &ends, vector<int> &nums) { |
| vector<int> rightMaxLen(nums.size()); |
| int len = 0; |
| for (int i = n - 1, pos; i >= 0; i--) { |
| pos = binarySearch1(ends, len, nums[i]); |
| if (pos == len) { |
| |
| ends[len++] = nums[i]; |
| |
| rightMaxLen[i] = len; |
| } else { |
| ends[pos] = nums[i]; |
| rightMaxLen[i] = pos + 1; |
| } |
| } |
| return rightMaxLen; |
| } |
| |
| int main() { |
| cin >> n >> k; |
| vector<int> nums; |
| nums.resize(n); |
| for (int i = 0; i < n; ++i) |
| cin >> nums[i]; |
| |
| |
| vector<int> ends(n); |
| vector<int> rightMaxLen = getRightMaxLen(ends, nums); |
| |
| int len = 0; |
| int res = 0; |
| for (int i = 0, j = k, pos; j < n; i++, j++) { |
| |
| pos = binarySearch2(ends, len, nums[j]); |
| |
| |
| |
| |
| |
| res = max(res, pos + k + rightMaxLen[j]); |
| |
| |
| pos = binarySearch2(ends, len, nums[i]); |
| if (pos == len) { |
| ends[len++] = nums[i]; |
| } else { |
| ends[pos] = nums[i]; |
| } |
| } |
| |
| res = max(res, len + k); |
| cout << res; |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18466191
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步