问题描述:
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)