【LeetCode 面试经典150题】300. Longest Increasing Subsequence 最长递增子序列

文章讲述了如何使用动态规划和二分搜索算法计算给定整数数组中最长严格递增子序列的长度。通过遍历数组,对每个元素进行插入位置的查找,更新最长递增子序列数组,最后返回其长度。
摘要由CSDN通过智能技术生成

300. Longest Increasing Subsequence(最长递增子序列)

题目大意

Given an integer array nums, return the length of the longest strictly increasing subsequence.

中文释义

给定一个整数数组 nums,返回最长严格递增子序列的长度。

示例

  • 示例 1:
    • 输入:nums = [10,9,2,5,3,7,101,18]
    • 输出:4
    • 解释:最长递增子序列是 [2,3,7,101],因此长度为 4。
  • 示例 2:
    • 输入:nums = [0,1,0,3,2,3]
    • 输出:4
  • 示例 3:
    • 输入:nums = [7,7,7,7,7,7,7]
    • 输出:1

限制条件

  • 1 <= nums.length <= 2500
  • -10^4 <= nums[i] <= 10^4

进阶

你能否想出一个运行时间复杂度为 O(n log(n)) 的算法?

解题思路

使用动态规划和二分搜索的方法解决问题。创建一个数组 tails 来保存当前找到的最长递增子序列。

步骤说明

  1. 遍历数组 nums 中的每个元素。
  2. 对于每个元素,使用二分搜索在 tails 中找到它应该插入的位置。
  3. 如果元素大于 tails 中的所有元素,则将它添加到 tails 的末尾。
  4. 如果找到一个位置,则用当前元素替换在该位置的元素。
  5. 最终,tails 的大小即为最长递增子序列的长度。

代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> tails;
        for (int i = 0; i < nums.size(); i++) {
            auto it = lower_bound(tails.begin(), tails.end(), nums[i]);
            if (it == tails.end()) tails.push_back(nums[i]);
            else *it = nums[i];
        }
        return tails.size();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值