LeetCode 0300 -- 最长上升子序列

最长上升子序列

题目描述

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

示例:

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

说明:

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

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

解题思路

个人AC

维持一个子序列sequence,该序列中的元素是递增的,该序列实际承载元素的数量即为最长上升子序列的长度。遍历给定数组:

  • nums[i]大于sequence的最后一个元素时,直接将nums[i]置于该元素末尾,能够维护最长上升子序列的长度;
  • 否则,利用二分查找(时间复杂度为 O ( l o g n ) O(logn) O(logn))在sequence中寻找将要被nums[i]替换的元素的位置,即找到sequence中大于nums[i]的最小元素的位置。
class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        if (n < 2) return n;

        int[] sequence = new int[n];
        sequence[0] = nums[0];
        int maxLen = 1; // sequence的容量,即最长上升子序列的长度
        for (int i = 1; i < n; i++) {
            if (nums[i] > sequence[maxLen - 1]) { // 如果nums[i]大于sequence序列的最后一个元素,则直接放入其尾部即可
                sequence[maxLen++] = nums[i];
            } else { // 否则,使用二分法将nums[i]替换掉sequence序列中大于nums[i]的最小元素
                int pos = binarySearch(sequence, 0, maxLen, nums[i]);
                if (pos >= 0) {
                    sequence[pos] = nums[i];
                }
            }
        }
        return maxLen;
    }

    // 找到sequence[0, maxLen)中大于target的最小元素的位置
    private int binarySearch(int[] sequence, int left, int right, int target) {
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (sequence[mid] == target) { // 如果target存在于sequence[0, maxLen)中,则返回-1,表明无需替换
                return -1;
            } else if (sequence[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
}

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

空间复杂度: O ( n ) O(n) O(n)

最优解

同上。

参考

图解一道腾讯笔试算法题:「最长上升子序列」

内容概要:本文详细介绍了QY20B型汽车起重机液压系统的设计过程,涵盖其背景、发展史、主要运动机构及其液压回路设计。文章首先概述了汽车起重机的分类发展历程,强调了液压技术在现代起重机中的重要性。接着,文章深入分析了QY20B型汽车起重机的五大主要运动机构(支腿、回转、伸缩、变幅、起升)的工作原理及相应的液压回路设计。每个回路的设计均考虑了性能要求、功能实现及工作原理,确保系统稳定可靠。此外,文章还详细计算了支腿油缸的受力、液压元件的选择及液压系统的性能验算,确保设计的可行性安全性。 适合人群:从事工程机械设计、液压系统设计及相关领域的工程师技术人员,以及对起重机技术感兴趣的高等院校学生研究人员。 使用场景及目标:①为从事汽车起重机液压系统设计的工程师提供详细的参考案例;②帮助技术人员理解掌握液压系统设计的关键技术计算方法;③为高等院校学生提供学习研究起重机液压系统设计的实用资料。 其他说明:本文不仅提供了详细的液压系统设计过程,还结合了实际工程应用,确保设计的实用性可靠性。文中引用了大量参考文献,确保设计依据的科学性权威性。阅读本文有助于读者深入了解汽车起重机液压系统的设计原理实现方法,为实际工程应用提供有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值