zoukankan      html  css  js  c++  java
  • LeetCode 25.最长上升子序列 动态规划

    题目描述

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

    示例:

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

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

    解题思路

    状态定义:

    dp[i]dp[i] 的值代表 nums 前 ii 个数字的最长子序列长度。
    转移方程: 设 j∈[0,i)j∈[0,i),考虑每轮计算新 dp[i]dp[i] 时,遍历 [0,i)[0,i) 列表区间,做以下判断:

    当 nums[i] > nums[j]nums[i]>nums[j] 时: nums[i]nums[i] 可以接在 nums[j]nums[j] 之后(此题要求严格递增),此情况下最长上升子序列长度为 dp[j] + 1dp[j]+1 ;
    当 nums[i] <= nums[j]nums[i]<=nums[j] 时: nums[i]nums[i] 无法接在 nums[j]nums[j] 之后,此情况上升子序列不成立,跳过。
    上述所有 1. 情况 下计算出的 dp[j] + 1dp[j]+1 的最大值,为直到 ii 的最长上升子序列长度(即 dp[i]dp[i] )。实现方式为遍历 jj 时,每轮执行 dp[i] = max(dp[i], dp[j] + 1)dp[i]=max(dp[i],dp[j]+1)。
    转移方程: dp[i] = max(dp[i], dp[j] + 1) for j in [0, i)。
    初始状态:

    dp[i]dp[i] 所有元素置 11,含义是每个元素都至少可以单独成为子序列,此时长度都为 11。
    返回值:

    返回 dpdp 列表最大值,即可得到全局最长上升子序列长度。
    复杂度分析:
    时间复杂度 O(N^2)O(N
    2
    ) : 遍历计算 dpdp 列表需 O(N)O(N),计算每个 dp[i]dp[i] 需 O(N)O(N)。
    空间复杂度 O(N)O(N) : dpdp 列表占用线性大小额外空间。

    作者:jyd
    链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-dong-tai-gui-hua-2/
    来源:力扣(LeetCode)

    代码如下

    class Solution {
      public int lengthOfLIS(int[] nums) {
            if (nums.length==0) {
                return 0;
            }
            
            int max=Integer.MIN_VALUE;
            int[] dp=new int[nums.length];
            Arrays.fill(dp, 1);
            for (int i = 0; i < dp.length; i++) {
                for (int j = 0; j < i; j++) {
                    if (nums[j]<nums[i]) {
                        dp[i]=Math.max(dp[i], dp[j]+1);
                    }
                }
            }
            Arrays.sort(dp);
             return dp[dp.length-1];
    
            }
    }
  • 相关阅读:
    kubernetes 网络故障遇见的坑
    CentOS7 Rsync服务搭建-Rsync+Inotify架构实现实时同步
    centos 7 git的管理和使用
    阿里云 ECS 监控报警设置
    ECS centos7 使用外部邮件服务商的465加密端口
    阿里云ECS 固定带宽变为按量付费的方式
    centos6 和centos7 安装git 的区别
    nginx 新增域名访问
    if 判断文件
    前端基础进阶(一):内存空间详细图解
  • 原文地址:https://www.cnblogs.com/Transkai/p/12492164.html
Copyright © 2011-2022 走看看