LeetCode-300-最长上升子序列

题目

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

示例:

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

 

思路

使用DP数组存储当前位置的最长上升子序列长度

位置 i 的最长子序列长度由 i 之前的小于num[i] 的值中的最长上升子序列长度+1计算得到。

示例:

数组num:[10,9,2,5,3,7,101,18]
数组dp: [1,1,1,2,2,3,4,4]

输出:4

 

 

状态转移方程: dp[i] =max( dp[j] ) + 1 ,其中,num[j]<num[i].

 

 1 public int lengthOfLIS(int[] nums) {
 2         int re = Integer.MIN_VALUE;
 3         if (nums.length == 0) return 0;        
 4         int[] dp = new int[nums.length];
 5         
 6         dp[0] = 1;
 7         
 8         for(int i=1;i<nums.length;i++) {
 9             int maxlen = Integer.MIN_VALUE;
10             for(int j=i-1;j>=0;j--) {
11                 
12                 if(nums[j]<nums[i] && dp[j]>maxlen) {
13                     maxlen = dp[j];
14                 }
15                 else if(j==0 && nums[j]>nums[i] && maxlen == Integer.MIN_VALUE) 
16                     maxlen = 0;
17                 
18             }
19             dp[i] = maxlen + 1;
20             
21         }
22         
23         for(int i=0;i<dp.length;i++) {
24             if(dp[i] > re) re = dp[i];
25         }
26         
27         
28         return re ;
29     }

 

posted @ 2020-07-15 16:47  垫底研究生小莫  阅读(160)  评论(1编辑  收藏  举报