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; } }