Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18]
,
The longest increasing subsequence is [2, 3, 7, 101]
, therefore the length is 4
. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
Credits:
Special thanks to @pbrother for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
从左到右扫描数组,放在新的数组中,并用Binary search 寻找当前元素要插入到新数组的位置,如果超出索引范围,数组扩张一位并放入当前元素,这样能保持新的数组的升序特性。否则,在插入位置上,将当前元素替换掉旧的元素,保存障碍信息。最终新的数组的长度就是结果。
import bisect class Solution(object): def lengthOfLIS(self, nums): """ :type nums: List[int] :rtype: int """ seq = [] for num in nums: insert_idx = bisect.bisect_left(seq, num) # duplicate if insert_idx == len(seq): seq.append(num) else: seq[insert_idx] = num return len(seq)