LeetCode300、最長増加部分列

タイトル説明

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)として最適化):

おすすめ

転載: blog.csdn.net/qq_44861675/article/details/114435176
おすすめ