给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
用动态规划O(n^2)
状态转移方程好难想啊a。。。
dp[n-1]—>dp[n]
假设我们已经知道了 dp[0…4] 的所有结果,我们如何通过这些已知结果推出 dp[5] 呢?
nums[5] = 3,既然是递增子序列,我们只要找到前面那些结尾比 3 小的子序列,然后把 3 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加一。
显然,可能形成很多种新的子序列,但是我们只选择最长的那一个,把最长子序列的长度作为 dp[5] 的值即可。
class Solution {
public int lengthOfLIS(int[] nums) {
if(nums.length==0) return 0;
int dp[] = new int[nums.length];
//Arrays.fill() 好废时间啊,是因为import包么?
for(int i=0;i<dp.length;i++){
dp[i]=1;
}
for(int i=0;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i]=Math.max(dp[i],dp[j]+1);
}
}
}
int max=0;
for(int i=0;i<dp.length;i++){
max=Math.max(dp[i],max);
}
return max;
}
}