diff --git "a/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\212\250\346\200\201\350\247\204\345\210\222\350\256\276\350\256\241\357\274\232\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\212\250\346\200\201\350\247\204\345\210\222\350\256\276\350\256\241\357\274\232\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" index c905a6095e..b1ee2a9b1a 100644 --- "a/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\212\250\346\200\201\350\247\204\345\210\222\350\256\276\350\256\241\357\274\232\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" +++ "b/\345\212\250\346\200\201\350\247\204\345\210\222\347\263\273\345\210\227/\345\212\250\346\200\201\350\247\204\345\210\222\350\256\276\350\256\241\357\274\232\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.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; + } +}; +```