#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时的置换规则为:

  1. 若该元素(记为a)比tmp最大的元素还大,则直接加入最后方。
  2. 若该元素比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\)。详见详解二分查找

Github

posted @ 2020-03-22 15:43  Lyu1997  阅读(131)  评论(0编辑  收藏  举报