300. Longest Increasing Subsequence
1. 题目
300. 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.
Note:
There may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
2. 题目分析
寻找最大上升子序列的数量,前面已经分析了,子序列是不要连续的。
3. 解题思路
找最优解,则使用动态规划的方式,用dp[i]表示第i元素处于的递增子序列中的个数。
4. 代码实现(java)
package com.algorithm.leetcode.dynamicAllocation;
/**
* Created by 凌 on 2019/2/9.
* 注释:300. Longest Increasing Subsequence
*/
public class LengthOfLIS {
public static void main(String[] args) {
// int[] A={10,9,2,5,3,7,101,18};
int[] A={1,2};
int result = lengthOfLIS(A);
System.out.println(result);
}
/**
* 最长上升子序列(不要求连续)
* 使用动态规划的方式,用dp[i]表示第i元素处于的递增子序列中的个数
* @param nums
* @return
*/
public static int lengthOfLIS(int[] nums) {
if (nums==null || nums.length==0){
return 0;
}
int[] dp=new int[nums.length];
int maxLength=1;
dp[0]=1;
for (int i = 1; i < nums.length; i++) {
dp[i]=1;
for (int j = i-1; j >= 0; j--) {
if (nums[i] > nums[j]){
dp[i] = Math.max(dp[i],dp[j]+1);
maxLength = Math.max(dp[i],maxLength);
}
}
}
return maxLength;
}
}