[LeetCode] 300. 最长上升子序列

用一个栈去存储,从头开始遍历,若遇到比自己大的就放到栈中。

package leetcode;

import java.util.Stack;

/**
 * @author doyinana
 * @create 2020-07-22 9:57
 */
public class L300 {
    public int lengthOfLIS(int[] nums) {
        Stack<Integer> stack = new Stack<>();
        int maxLen=0;
        for(int i=0;i<nums.length;i++){
            stack.push(nums[i]);
            int n=1;
            for(int j=i;j<nums.length;j++){
                if(nums[j]>stack.peek()){
                    stack.push(nums[j]);
                    n +=1;
                }
            }
            maxLen=Math.max(maxLen,n);
        }
        return maxLen;
    }
}
View Code

代码有误。。。。。

可以用动态规划去做,一开始也有想到用一个dp[]去存储,本来觉得有问题得,但是好像也可以这样做

package leetcode;

import java.util.Arrays;
import java.util.Stack;

/**
 * @author doyinana
 * @create 2020-07-22 9:57
 */
public class L300 {
    public int lengthOfLIS(int[] nums) {
        if(nums.length==0) return 0;
        int[] dp = new int[nums.length];
        int res=0;
        Arrays.fill(dp,1);
        for(int i=0;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;
    }
}

 方法二:

 

 还需要考虑 !!二分法!

原文地址:https://www.cnblogs.com/doyi111/p/13359420.html