leetcode [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 is4.
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?
题目大意:
找出最长上升子序列的长度。
解法:
采用动态规划的方法,使用一个dp[index]数组来记录到当前index的子序列长度,这种解法的时间复杂度是O(n^2)。
java:
class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length==0) return 0;
int[] dp=new int[nums.length];
Arrays.fill(dp,1);
int res=1;
for (int i=1;i<nums.length;i++){
for (int j=0;j<i;j++){
if (nums[j]<nums[i]) {
dp[i]=Math.max(dp[i],dp[j]+1);
res=Math.max(res,dp[i]);
}
}
}
return res;
}
}
网上最优的解法:
没太看懂...
class Solution {
public int lengthOfLIS(int[] nums) {
int[] tails=new int[nums.length];
int size=0;
for (int x:nums){
int i=0,j=size;
while (i!=j){
int m=(i+j)/2;
if (tails[m]<x) i=m+1;
else j=m;
}
tails[i]=x;
if (i==size) ++size;
}
return size;
}
}

浙公网安备 33010602011771号