Leetcode 300.最长上升子序列

最长上升子序列

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

示例:

输入: [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 }

猜你喜欢

转载自www.cnblogs.com/kexinxin/p/10205018.html
今日推荐