最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [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 }