タイトル説明
https://leetcode-cn.com/problems/longest-increasing-subsequence/submissions/
ソリューション(動的計画法思考プロセス)
考え:
//定义dp数组的含义(暂时无法直接确定维数)
//dp[i]表示以num[i]为结尾元素的最长递增子序列
/*
*思考递推的过程是什么?知道了dp[0],dp[1],dp[...],dp[i-1],如何递推dp[i],
以数学归纳法的方式去思考递推,不要只限定在只知道dp[i]如何求dp[i+1]上
我们以我们人的实际考虑,用一个例子,来推演
数组:1 3 5 2 4 3 3 5
dp[0] = [1] dp[1]=2 dp[2]=3i
num【3】= 2,这个时候如何得到dp[3]? 因为dp[i]表示的是以nums[i]结尾的最长递增子序
dp[3]= 2,具体过程:在下标3(i)之前,寻找比它小的元素,然后其之前的序列和num【i】就组成了新的序列,
但是这样还不够,毕竟这样的序列很多,我们需要取最大值
-------如果我们无法得到递推,或者思考不出来,我们要回到第一步,思考自己的dp数组含义是否有误或者记录的信息不够
*/
/*
思考了递推的过程,我们现在思考返回的结果:返回所有的dp【i】中的最大值
*/
/*
思考边界条件:
初始情况下,所有的dp[i]=1,毕竟要包括自身
*/
class Solution {
public int lengthOfLIS(int[] nums) {
if(nums==null) return 0;
int []dp = new int[nums.length];
//边界:
Arrays.fill(dp,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<nums.length;i++){
if(max<dp[i]){
max = dp[i];
}
}
return max;
}
}
時間計算量はO(n 2)であり、空間計算量はO(n)です。
高度なアプローチ(時間計算量をNlog(N)として最適化):