动态规划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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值