diff --git a/动态规划系列/动态规划设计:最长递增子序列.md b/动态规划系列/动态规划设计:最长递增子序列.md index 4613f84..a2a0460 100644 --- a/动态规划系列/动态规划设计:最长递增子序列.md +++ b/动态规划系列/动态规划设计:最长递增子序列.md @@ -215,4 +215,45 @@ public int lengthOfLIS(int[] nums) {

-======其他语言代码====== \ No newline at end of file +======其他语言代码====== + +[Kian](https://github.com/KianKw/) 提供 C++ 代码 + +```c++ +class Solution { +public: + int lengthOfLIS(vector& nums) { + /* len 为牌的数量 */ + int len = nums.size(); + vector top(len, 0); + /* 牌堆数初始化为0 */ + int piles = 0; + for (int i = 0; i < len; i++) { + /* nums[i] 为要处理的扑克牌 */ + int poker = nums[i]; + + /***** 搜索左侧边界的二分查找 *****/ + int left = 0, right = piles; + while (left < right) { + int mid = left + (right - left) / 2; + if (top[mid] > poker) { + right = mid; + } else if (top[mid] < poker) { + left = mid + 1; + } else if (top[mid] == poker) { + right = mid; + } + } + /*********************************/ + + /* 没找到合适的牌堆,新建一堆 */ + if (left == piles) + piles++; + /* 把这张牌放到牌堆顶 */ + top[left] = poker; + } + /* 牌堆数就是 LIS 长度 */ + return piles; + } +}; +```