码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 300.最长上升子序列

时间:2019-01-01 17:21:38      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:str   解释   示例   复杂   范围   它的   ==   bsp   etc   

最长上升子序列

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

示例:

输入: [10,9,2,5,3,7,101,18]

输出: 4

解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

说明:

  • 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
  • 你算法的时间复杂度应该为 O(n2) 。

进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

 

直接用DP求解,算法如下:时间复杂度为O(N^2)

①最优子问题

设lis[i] 表示索引为 [0...i] 上的数组上的 最长递增子序列。初始时,lis[i]=1,注意,在DP中,初始值是很重要的,它是整个算法运行正确的关键而初始值 则可以 通过 画一个小的示例来 确定。

当 arr[i] > arr[j],lis[i] = max{lis[j]}+1 ;其中,j 的取值范围为:0,1...i-1

当 arr[i] < arr[j],lis[i] = max{lis[j]} ;其中,j 的取值范围为:0,1...i-1

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

 

Leetcode 300.最长上升子序列

标签:str   解释   示例   复杂   范围   它的   ==   bsp   etc   

原文地址:https://www.cnblogs.com/kexinxin/p/10205018.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!