动态规划LeetCode300最长上升子序列

在做这道题之前,我们先看一下什么是子序列。

 区分子串和子序列:

给定 "pwwkew" ,

子串是pww,wwk等很多个子串 是连在一起的

子序列是 pwk,pke等很多个子序列 ,但是子序列中的字符在字符串中不一定是连在一起的。 

题目描述:

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

示例:

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

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

思路:dp[i]代表以第i个元素结尾的最长上升子序列的长度。

 1 class Solution {
 2     public int lengthOfLIS(int[] nums) {
 3         if (nums.length==0) {
 4             return 0;
 5         }
 6         int[] dp=new int[nums.length];
 7         dp[0]=1;
 8         int LIS=1;
 9         for (int i=0; i<nums.length; i++) {
10             dp[i]=1;
11             for (int j=0; j<i; j++) {
12                 if (nums[i]>nums[j]&&dp[i]<dp[j]+1) {
13                     dp[i]=dp[j]+1;
14                 }
15             }
16             if (dp[i]>LIS) {
17                 LIS=dp[i];
18             }
19         }
20         return LIS;
21     }
22 }

上面这个算法的时间复杂度为O(n^2)。

待会补充一下O(n*log n) 的解法,这个解法是利用栈和二分查找,大家先思考一下。

欢迎评论,共同进步!!

原文地址:https://www.cnblogs.com/hengzhezou/p/11044544.html