zoukankan      html  css  js  c++  java
  • Leetcode 300.最长上升子序列

    最长上升子序列

    给定一个无序的整数数组,找到其中最长上升子序列的长度。

    示例:

    输入: [10,9,2,5,3,7,101,18]

    输出: 4

    解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

    说明:

    • 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
    • 你算法的时间复杂度应该为 O(n2) 。

    进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

    直接用DP求解,算法如下:时间复杂度为O(N^2)

    ①最优子问题

    设lis[i] 表示索引为 [0...i] 上的数组上的 最长递增子序列。初始时,lis[i]=1,注意,在DP中,初始值是很重要的,它是整个算法运行正确的关键而初始值 则可以 通过 画一个小的示例来 确定。

    当 arr[i] > arr[j],lis[i] = max{lis[j]}+1 ;其中,j 的取值范围为:0,1...i-1

    当 arr[i] < arr[j],lis[i] = max{lis[j]} ;其中,j 的取值范围为:0,1...i-1

     1 class Solution {
     2     public int lengthOfLIS(int[] nums) {
     3         int length=nums.length;
     4         if(nums==null || length==0) return 0;
     5         int[] dp=new int[length];
     6         for(int i=0;i<length;i++){
     7             dp[i]=1;
     8         }
     9         for(int i=1;i<length;i++){
    10             for(int j=0;j<i;j++){
    11                 if(nums[i]>nums[j]&&dp[j]+1>dp[i]){
    12                     dp[i]=dp[j]+1;
    13                 }
    14             }
    15         }
    16         int max=dp[0];
    17         for(int i=1;i<length;i++){
    18             if(max<dp[i]){
    19                 max=dp[i];
    20             }
    21         }
    22         return max;
    23     }
    24 }
  • 相关阅读:
    SpringMVC组件解析
    SpringMVC简介
    spring集成web环境
    Spring基于注解的事务控制
    Spring基于XML声明式事务控制
    Spring事务控制&编程式事务控制三大对象
    基于注解的AOP开发
    基于xml的AOP开发
    python字符串操作
    赋值、深拷贝、浅拷贝
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10205018.html
Copyright © 2011-2022 走看看