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


    本题是leetcode,地址:300. 最长上升子序列

    题目

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

    示例:

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

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

    分析

    如果nums[i] 数组中第i个元素的最长子序列结果是v1,那么下一个nums[i + 1]是可以参考nums[i]序列的值的结果的v1的,如果nums[i + 1] > nums[i] 那么最子序列就可以+1;否则相等;

    类似这种下一个结算结果可以参考上一个结果的题目,可以考虑使用动态规划解决,解题步骤是:

    • 思考状态:定义 dp[i]dp[i] 为考虑前 i个元素,以第 i个数字结尾的最长上升子序列的长度,注意 nums[i] 必须被选取。
    • 思考状态转移方程 :
    dp[i]=max(dp[j])+1,其中0≤j<i且num[j]<num[i]
    
    • 思考初始化:每一个nums[j],最短的子序列都是1,即dp[i] = 1;
    • 思考输出:
    max(dp[i]),其中0≤i<n
    

    code

        public int lengthOfLIS(int[] nums) {
    				// dp[i] = 1;
            int[] dp = new int[nums.length];
            Arrays.fill(dp, 1);
    
            int res = 0;
            for (int i = 0; i < nums.length; i++) {
                // 计算dp[i]的条件,在已经计算过的dp数组中找,如果num[i]>num[j],则取dp[j]+1的值,
                // 使用Math.max函数原因是覆盖上一次比较的结果;
                for (int j = 0; j < i; j++) {
                    if (nums[i] > nums[j]) {
                        dp[i] = Math.max(dp[i], dp[j] + 1);
                    }
                }
                if (dp[i] > res) {
                    res = dp[i];
                }
            }
            return res;
        }
    

    你的鼓励也是我创作的动力

    打赏地址

  • 相关阅读:
    centos crash debug
    go get Unknown SSL protocol error in connection to gopkg.in
    Tensorflow serving with Kubernetes
    Spring 集成 Swagger UI
    Docker Registry V2 Garbage Collection
    Docker Registry V2 with Nginx
    Zabbix磁盘性能监控
    Zabbix CPU utilization监控参数
    Windows挂载Gluster复制卷
    Redis持久化存储(三)
  • 原文地址:https://www.cnblogs.com/yangsanchao/p/13339725.html
Copyright © 2011-2022 走看看