#300 Longest Increasing Subsequence
#300 Longest Increasing Subsequence
问题描述
Given an unsorted array of integers, find the length of longest increasing subsequence.
Input: [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
我们只需要求最小上升子序列的长度,因此设置一个tmp列表按照从小到大的顺序来储存元素。在遍历原list时的置换规则为:
- 若该元素(记为a)比tmp最大的元素还大,则直接加入最后方。
- 若该元素比tmp最大的元素小,则找到tmp列表中第一个比a大的元素与其置换,如果tmp中存在与a相等的元素则无需改变。
这样我们得到的可能不是正确的最长子序列,但是其长度一定是最长子序列的长度。
另一个点在于如何找到tmp列表中第一个比a元素大的值,这里使用二分查找。
时间复杂度:\(O(nlogn)\),对于一次遍历的元素,如果要进行二分查找,则需要\(O(logn)\)
空间复杂度:\(O(n)\),仅需长度为\(n\)的列表储存
代码解释
line 8:若当前元素比最大的元素还大,直接加入
line 10:若当前元素没有最大的元素大,则在tmp中寻找可以置换的元素
line 12~20:二分查找,这里有一个小技巧,由于我们查找的是第一个比当前元素大的index,所以我们更新\(right=mid, left = mid+1\)。详见详解二分查找