LeetCode-300:Longest Increasing Subsequence (最长递增子序列)

边缘计算与产业生态系统 目录 文章目录目录边缘计算产业参与者边缘计算产业生态系统 边缘计算产业参与者 边缘计算领域参与者众多,主流公司以打造生态优势为目标,基于自身服务层级向产业链上下两端进行拓展,目前市场主要参与者有: 系统集成商:在产业头部,具有广泛的能力,可以集成不同生态系统公司的产品,具有一定的全球性属性,在边缘计算领域大多由云服务商、电信运营商担任。 云服务商:具有领先的云技术优势与应用生态体系,同时拥有全球性资源布局与市场资源生态,并渴望成为边缘计算主导者。 电信运营商:具有边缘基础设施优势,以及不可替代的 阅读详情

题目:

Given an unsorted array of integers, find the length of longest increasing subsequence.

例子

Given

[10, 9, 2, 5, 3, 7, 101, 18]

The longest increasing subsequence is:

[2, 3, 7, 101], therefore the length is 4. 

Note that there may be more than one LIS combination, it is only necessary for you to return the length.

问题解析:

求数组的最长递增子序列的长度。

链接:

思路标签:

算法:动态规划、二分查找

解答:

1. 求最长递增子数组的长度,时间复杂度:O(nlogn)
  • 使用一个二分查找的方式,找到递增子数组中大于等于当前值的第一个数的位置;
  • 如果找到,则利用当前值替换;否则将当前值加入到递增子数组中,表明该值比子数组的值都大,可能输入子数组。
  • 例子:nums = [5,6,7,1,2,8,3,4,0,5,9]:
    • 遍历到 7: res = [5,6,7];
    • 遍历到 2: res = [1,2,7];
    • 遍历到 8: res = [1,2,7,8];
    • 遍历到 3: res = [1,2,3,8];
    • 遍历到 4: res = [1,2,3,4];
    • 剩下三个元素 : res = [0,2,3,4,5,9];
    • 最后我们就可以得到最长递增子序列的长度,但是这里要注意得到的子序列不是真正的子序列,然而其长度是正确的。
  • 该算法无法得到最长递增子序列,仅计算长度。
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if(nums.size() <= 0) return 0;
        vector<int> res;
        for(int i=0; i<nums.size(); ++i){
            auto it = lower_bound(res.begin(), res.end(), nums[i]);
            if(it == res.end())
                res.push_back(nums[i]);
            else
                *it = nums[i];
        }

        return res.size();
    }
};
2. 可以得到最长递增子序列的方法,时间复杂度:O(n^2)
  • 需要一个保存到当前元素最长的子序列的长度的数组,以及一个保存当前元素的前驱数组;
  • 对于每个元素需要与其前面的所有元素进行比较,以不断更新最长子序列的长度和前驱;
  • LIS返回最长子序列的长度,然后通过前驱数组,找到第一个最长子序列。
#include <iostream>
#include <vector>
using namespace std;

/*
arr: int数组
pre: array同等长度的int数组 记录第i个结点的前驱
nIndex: 最大长度所在的下标
*/

int LIS(const vector<int> &arr, vector<int> &pre, int &nIndex) {
    int length = arr.size();
    if (length <= 1)
        return arr.size();

    //初始化当前最长递增子序列的最大长度数组 & 前驱数组
    vector<int> longest(length, 1); 
    for (int i = 0; i < length; i++) {
        pre.push_back(-1);
    }

    //记录最长的长度  初始化为1
    int nLis = 1;
    for (int i = 1; i < length; i++) {
        for (int j = 0; j < i; j++) {
            if (arr[j] <= arr[i]) {
                //如果递增 并且通过第j个结点可以达到更长则更新并记录前驱
                if (longest[i] < longest[j] + 1) {
                    longest[i] = longest[j] + 1;
                    pre[i] = j;
                }
            }
        }

        //统计最大的值及位置
        if (nLis < longest[i]) { 
            nLis = longest[i];
            nIndex = i;
        }
    }
    return nLis;
}

//获取最大长度的序列  主要通过前驱查找
void GetLis(const vector<int> &arr, const vector<int> &pre, vector<int> &lis, int nIndex) {
    while (nIndex >= 0)
    {
        lis.push_back(arr[nIndex]);
        nIndex = pre[nIndex];
    }
    //数组翻转
    reverse(lis.begin(), lis.end());
}

//输出序列
void Print(const vector<int> &arr) {
    for (int i = 0; i < arr.size(); i++)
        cout << arr[i] << " ";
    cout << endl;
}

int main()
{
    vector<int> arr = { 23,56,43,12,78,4,9,10,68,42 };
    vector<int> pre;
    int nIndex;
    int max = LIS(arr, pre, nIndex);
    vector<int> lis;
    GetLis(arr, pre, lis, nIndex);
    Print(arr);
    cout << "最大长度: " << max << endl;
    Print(lis);
    return 0;
}
使用 IMDb API 获取电影评分和评论的 Python 爬虫 电影是人们娱乐生活中的重要组成部分,随着电影产业的快速发展,观众对电影的评价也越来越多样化。IMDb(互联网电影数据库)作为全球最大的电影评分和评论平台之一,收录了成千上万部电影、电视节目及其相关数据。它提供了一个强大的 API 接口,允许开发者访问电影的评分、评论、演员信息等数据。本文将带你一步一步实现一个 Python 爬虫,使用 IMDb API 获取电影的评分和评论。我们将通过这个爬虫来分析一些热门电影的观众反馈,并可视化分析结果。 阅读详情

相关推荐

物联网开发笔记(34)- 使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

zhusongziye的博客 1万+

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

定义 最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。 问题描述 给定一个长度为 N 的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为 5 的数组{5, 6, 1, 2, 8},则其最长的单调递增子序列为 {5,6,8},长度为 3。 解法 动态规划 时间复杂度 该方法的时间复杂度为 。 实现过程 下面我们用一个实例来分析一下动态规划求解 LIS 的整个过程。

努力中的老周的专栏 4370

单周期CPU设计【Verilog】

第一章 单周期CPU的设计原理 为实现单周期CPU,本文首先研究了单周期CPU的相关理论和工作原理。本章首先简要介绍单周期CPU的基本概念,然后对CPU的工作原理进行简要分析,以便为单周期CPU的设计和开发提供理论基础。 1.1 单周期CPU概述 中央处理器,即CPU,作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。在CPU内部,电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一

醉酒、冰城外 2万+

最长递增子序列(Longest Increasing Subsequence)-C语言实现

最长递增子序列 动态规划 C语言

Jasonchen1224的博客 2697

Trans论文复现:电池储能调峰和调频:超线性增益的联合优化程序代码!

本程序参考一区SCI期刊《Using Battery Storage for Peak Shaving and Frequency Regulation: Joint Optimization for Superlinear Gains》,程序。与之前将电池储能用于单一应用相比,研究结果表明,如果电池联合提供多种服务,它们可以获得比以前想象的更大的经济效益。欢迎感兴趣的小伙伴关注下方公众号获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~限于篇幅,仅列出部分算例的结果!

weixin_48747334的博客 567

Eplan P8自动线号生成全攻略:从电位定义点到连接编号的完整流程

本文详细解析了Eplan P8自动线号生成的全流程,从电位定义点的创建配置到连接编号的标准化管理,帮助电气设计人员提升图纸规范性和工作效率。重点介绍了自动编号方案的定义与调整技巧,以及企业级标准化实施建议,是掌握Eplan P8自动线号功能的实用指南。

weixin_29254029的博客 510

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

Level:   Medium 题目描述: Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subse...

weixin_30404405的博客 248

STM32CubeMX安装避坑指南:为什么你的Java环境总是报错?

本文针对STM32CubeMX安装过程中最常见的Java环境报错问题,提供了一套完整的诊断与解决方案。文章深入剖析了JRE版本冲突、环境变量配置错误、路径权限等核心原因,并给出了从系统级检查到手动修正环境变量的详细步骤,帮助开发者彻底解决安装难题,顺利开启STM32开发之旅。

prometheus9mon的博客 226

c++中的最长递增子序列(Longest Increasing Subsequence)(算法章完结)

hello大家好啊,我是文宇。今天是最后一篇算法(暂时性的,以后可能还有)算法章完结。预告:下周会出 《一周速通c++(顺序,选择,循环篇)》。后面还有函数,数组,字符串等。

文宇的博客 736

【数据分享】12.5米分辨率DEM地形数据(分省)

该数据来源于NASA地球科学数据网站(https://nasadaacs.eos.nasa.gov/),是ALOS卫星获取的高精度地形数据。该数据由于精度高,包括全省范围的数据和省内每个城市范围的数据!

JData_Engineer的博客 2172

AutoSar实战营 - 总目录

欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址

weixin_48498880的博客 3633

最长上升子序列(Longest Increasing Subsequence)问题(两种解法)

前言 问题介绍 求解方法 # 前言 本篇博客主要介绍了有关最长上升子序列(LIS)的三种DP解决方法,分别是O(n^2),O(nlogn)(贪心加二分)和O(nlogn)(树状数组优化)的三种DP 问题介绍 对于一个有序序列x1,x2,x3,...,xnx1,x2,x3,...,xnx_1,x_2,x_3,...,x_n 我们可以从其中得到一序列ai1,ai2,ai3,...

Mouse_liang的博客 7933

anaconda navigator 卡在loading application界面一直没有反应解决办法

在打开anaconda navigator 程序的时候,遇到了2个问题。第一个问题:打开的时候弹出提示:There is an instance of Anaconda Navigator already running.第二个问题:程序一直卡在loading application界面一直没有反应。以下是我的解决办法,有效果。

猿小白的博客 4384

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

原题网址:https://leetcode.com/problems/longest-increasing-subsequence/ Given an unsorted array of integers, find the length of longest increasing subsequence. For example, Given [10, 9, 2, 5, 3,

James Pan 2671

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

leetcode-300. Longest Increasing Subsequence最长递增子序列

300. Longest Increasing Subsequence题目动态规划二分法 题目 Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101], therefor

。 221

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

原题 Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is [2,3,7,...

Dby_freedom的博客 421

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Leetcode 300. Longest Increasing Subsequence 最长的递增子序列 dp

300. Longest Increasing Subsequence 2020/3/22 下午6:30 给出一个整数构成的数组,找到最长的递增子序列的长度。 Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,10...

Chris Blog 135

【LeetCode 300 Longest Increasing Subsequence】最长递增子序列

一、题目描述 给定一个乱序整数序列,要求算法在这个乱序序列中找到最长递增子序列,并且返回长度。例如,给定序列[10,9,2,5,3,7,101,18],最长的递增子序列为[2,3,7,101],因此返回长度为4,最长递增子序列可以有多个,只是其拥有一个固定的最大长度值。算法要求在O(n^2)的时间复杂度中完成,也可以尽可能的优化到O(n log n)的时间复杂度。 二、思路分析 根据分治算法

codekiller_的博客 381

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

求最长递增子序列是深度优先搜索(DFS)的一种应用,有两种比较好的方法可以解决。简而言之,按顺序判断数组每个元素,如果该元素大于已加入的所有元素,则直接append到LIST数组结尾,反之替换数组中不影响数组长度的最大元素。举例说明,如上图,遍历至5,可替换上一步加入的8且数组长度依然为3。2)接着开始动态规划,如果该元素大于其下一个元素,即表明下一个元素可以成为递增子序列的一员跟该元素放在一起。此时,规划的对象就由该元素移至下一个元素,直至不满足判断条件。LIST初始值为1,即该数组元素本身作为序列值。

m0_45175452的博客 1171

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

dp[i]表示以nums[i]结尾的最长递增子序列的长度。

2501_91641025的博客 462

【LeetCode】300.Longest Increasing Subsequence最长递增子序列LIS

给定数组 [10, 9, 2, 5, 3, 7, 101, 18],其中一个最长递增子序列(不需要连续)为[2, 3, 7, 101] ,length为4。因为最长子序列不一定唯一,所以我们只需要返回长度值。 【解题思路】 老师上课讲的经典的一道动态规划。而且有两种方法:O(n2)和O(nlogn)。 (1)方法1:常规思路,O(n2) f[i]:表示以元素a[i]为结尾的最长递增子序列的

myangel_xy的博客 332

leetcode 300. Longest Increasing Subsequence | 300. 最长递增子序列(动态规划)

题目 https://leetcode.com/problems/longest-increasing-subsequence/ 题解 难得有官方题解的一道题。 参考:https://leetcode.com/problems/longest-increasing-subsequence/solution/ Approach 1: Dynamic Programming Realizing a Dynamic Programming Problem This problem has two importa

寒泉 5万+

leetcode300---Longest Increasing Subsequence(最长递增子序列)

问题描述:Given an unsorted array of integers, find the length of longest increasing subsequence.For example,Given [10, 9, 2, 5, 3, 7, 101, 18],The longest increasing subsequence is [2, 3, 7, 101], therefor

爱橙子的OK绷的专栏 1668

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

Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101], ...

蓝羽飞鸟的博客 293

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

nums。

qq_43513394的博客 598

Leetcode 300 Longest Increasing Subsequence 最长递增子序列

Given an unsorted array of integers, find the length of longest increasing subsequence. For example, Given [10, 9, 2, 5, 3, 7, 101, 18], The longest increasing subsequence is [2, 3, 7, 101], theref

hello_my_coder的博客 268
上一篇: LeetCode-69:Sqrt(x) (整数的平方根)
下一篇: LeetCode-72:Edit Distance (编辑距离)
大树先生的博客
博客等级 码龄9年 2692粉丝 200原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值