Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence.
Example:
Input: [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
分析:首先仔细审题,明确题目中的条件。
1、子序列:不要求连续子序列,只要保证元素前后顺序一致即可;
2、上升:这里的“上升”是“严格上升”,类似于 [2, 3, 3, 6, 7] 这样的子序列是不符合要求的;
一个序列可能有多个最长上升子序列,题目中只要我们求这个最长的长度。
- dp[i]含义:以下标为i的节点结尾的,最长的子序列长度是dp[i]
- 递推公式:要求dp[i],但是此时不能由dp[i-1]来找,而是要遍历j:[0,i) 来找,max(max,dp[j]+1),max暂存所有的dp[i的上一个]的值,最后通过max找到一个最大的赋值给dp[i]。—— dp[i]=dp[j]+1 for(j[0,i))&&nums[i]>nums[j]
- 初始值:dp[0]=1
- for循环:先i找到所有dp[i], 内循环遍历j[0,i),找到每个dp[i]
class Solution {
public int lengthOfLIS(int[] nums) {
int len=nums.length;
if(len<2){
return len;
}
int[] dp=new int[len];
dp[0]=1;
int max=1;
for(int i=1;i<len;i++){
dp[i]=1;//这个也算是初始化
for(int j=0;j<i;j++){
if(nums[j]<nums[i]){
dp[i]=Math.max(dp[j]+1,dp[i]);//对所有的dp[j]+1进行比较
}
}
max=Math.max(max,dp[i]);
}
return max;
}
}