• 动态规划LeetCode300最长上升子序列


    在做这道题之前,我们先看一下什么是子序列。

     区分子串和子序列:

    给定 "pwwkew" ,

    子串是pww,wwk等很多个子串 是连在一起的

    子序列是 pwk,pke等很多个子序列 ,但是子序列中的字符在字符串中不一定是连在一起的。 

    题目描述:

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

    示例:

    输入: [10,9,2,5,3,7,101,18]
    输出: 4
    解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
    说明:

    可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
    你算法的时间复杂度应该为 O(n^2)
    进阶: 你能将算法的时间复杂度降低到 O(n*log n) 吗?

    思路:dp[i]代表以第i个元素结尾的最长上升子序列的长度。

     1 class Solution {
     2     public int lengthOfLIS(int[] nums) {
     3         if (nums.length==0) {
     4             return 0;
     5         }
     6         int[] dp=new int[nums.length];
     7         dp[0]=1;
     8         int LIS=1;
     9         for (int i=0; i<nums.length; i++) {
    10             dp[i]=1;
    11             for (int j=0; j<i; j++) {
    12                 if (nums[i]>nums[j]&&dp[i]<dp[j]+1) {
    13                     dp[i]=dp[j]+1;
    14                 }
    15             }
    16             if (dp[i]>LIS) {
    17                 LIS=dp[i];
    18             }
    19         }
    20         return LIS;
    21     }
    22 }

    上面这个算法的时间复杂度为O(n^2)。

    待会补充一下O(n*log n) 的解法,这个解法是利用栈和二分查找,大家先思考一下。

    欢迎评论,共同进步!!

  • 相关阅读:
    WP2Sinablog使用后的后遗症
    .NET Framework 4 与 .NET Framework 4 Client Profile
    360浏览器也有了开发人员工具了
    让你的手机号“变”qq号
    首次体验 Live Writter
    判断素数
    SqlServer文件挂起
    vni—2015:验证错误
    成功者善于模仿(转)
    dbms_output缓冲区溢出
  • 原文地址:https://www.cnblogs.com/hengzhezou/p/11044544.html
Copyright © 2020-2023  润新知