leetcode-300. Longest Increasing Subsequence 最长上升子序列

Given an unsorted array of integers, find the length of longest increasing subsequence.

Example:

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. 

Note:

  • 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?

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:

可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

在真实的面试中遇到过这道题?

 

思路:

方法一:用dp来做。首先初始化长度为n的dp数组,数组默认值为1,因为每个元素至少对于自己来说是有序的。然后遍历dp数组,i从0到N-1,每遍历一个数,j从0开始找小于当前元素,那dp[i]=max(dp[i],dp[j]+1),dp[j]+1的意思就是当nums[j]

class Solution {
public:
    int lengthOfLIS(vector& nums) {
        vector dp(nums.size(),1);
        int res=0;
        for(int i=0;i

方法二:O(nlogn),用一个tail数组表示当前最长的递增子串,只需要在tail数组中用二分查找找第一个不小于num的数字,若数字不存在,则直接加入tail尾,因为tail也是最长递增子序列的一个值,若存在,则将这个数字更新为当前num,因为更新到的数字越小,最长递增序列出现的可能越大

动图参见:https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/dong-tai-gui-hua-er-fen-cha-zhao-tan-xin-suan-fa-p/

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        tail=[]
        for num in nums:
            l,r=0,len(tail)
            while l

 

你可能感兴趣的:(数据结构/算法/刷题)