57 最长递增子序列

news2025/1/16 3:58:54


给你一个整数数组 nums ,找到其中 最长严格递增子序列的长度

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 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
  • − 1 0 4 -10^4 104 <= nums[i] <= 1 0 4 10^4 104

进阶:

你能将算法的时间复杂度降低到 O ( n l o g ( n ) ) O(n log(n)) O(nlog(n)) 吗?

题解1 DP O ( n 2 ) O(n^{2}) O(n2)

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        int maxN = INT_MIN;
        /**
        dp[i] : i处数值对应的最长子序列长度
        **/
        for(int i = 1; i < nums.size(); i++){    
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j])
                    dp[i] = max(dp[i], dp[j]+1);
            }
            maxN = max(maxN, dp[i]);
        }
        return maxN == INT_MIN ? 1 : maxN;
    }
};

在这里插入图片描述

题解2 贪心+二分搜索(ref. from Leetcode) O ( n l o g ( n ) ) O(n log(n)) O(nlog(n))

“从左到右(序列顺序),维护一个每个元素尽可能小的LIS备选集合S”

每个元素尽可能小,这样更可能在末尾加上一个新的值,构成一个更大的LIS

只增加(add)和替换(swap),因此完成遍历后S的长度一定等于LIS的长度,部分元素可能被你替换掉了,所以在整个遍历过程中,这个集合S可能并不是LIS本身,尽管如此,LIS的元素一定曾出现在S中(但可能在遍历过程中被swap覆盖掉了)

鼓掌!!这个思想好棒

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if(1 == nums.size()) return 1;
        // p[i]: 长度为i的最长上升子序列的末尾元素最小值
        vector<int> p(nums.size()+1, 0);
        int len = 1;
        p[len] = nums[0];
        
        for(int i = 1; i < nums.size(); i++){
            if(nums[i] > p[len]){
                len ++;
                p[len] = nums[i];
            }else{
                // 在i位置不用遍历得到dp值
                // 长度=len+1的子序列的最小值 > nums[i],为了保持p的递增,需要修改某个位置的值
                // 用二分找到最近的j, 满足p[j] < nums[i] < p[j+1]
                // s.t. p[j+1] = nums[i];
                // 如果找不到, 说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0
                int left = 1;
                int right = len;
                int pos = 0;
                // 最希望的是改p[len], 所以判断条件 有 =
                // 实际上是想不用遍历,用二分检查一遍 nums[i]是不是大于len+1情况里的倒数第二个最大的数吧
                while(left <= right){
                    int mid = (left+right) >> 1;
                    // 找到了j
                    if(nums[i] > p[mid]){
                        pos = mid;
                        left = mid+1;
                    }  
                    else{
                        right = mid-1;
                    }
                }
                p[pos + 1] = nums[i];
            }
        }
        return len;
    }
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员,今天你被“投毒”了么?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 产品统筹 / bobo 联合制作 / RTE开发者社区 录音间 / 声湃轩北京站 近日&#xff0c;安恒信息 CERT 监测到一起 LNMP 遭受供应链投毒攻击事件。我们发现&#xff0c;在 lnmp.org …

03 里氏替换原则

官方定义&#xff1a; 里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;是由麻省理工学院计算机科学系教授芭芭拉利斯科夫于 1987 年在“面向对象技术的高峰会议”&#xff08;OOPSLA&#xff09;上发表的一篇论文《数据抽象和层次》&#…

02 开闭原则

官方定义&#xff1a; 开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的&#xff0c;但对于修 改是封闭的。这意味着应该用抽象定义结构&#xff0c;用具体实现扩展细节&#xff0c;以此确保 软件系统开发和维护过程的可靠性。 通俗解释&#xff1a; 对扩展开放…

什么是广告学?什么是广告理论?

想当年&#xff0c;我在众多的专业中选择了广告学&#xff0c;幻想着以后的激情岁月&#xff0c;拿着电脑&#xff0c;出入各种写字楼和同伴时不时拽两句英文。 来后&#xff0c;我也没发现学广告学能有什么远大的理想&#xff0c;满满当当的排课表上有广告学概论、市场营销学…

Go 泛型解密:从基础到实战的全方位解析

Go泛型解密 一、概述 泛型编程是计算机科学中一个相当重要的概念&#xff0c;广泛应用于各种编程语言和框架中。在Go语言中&#xff0c;泛型的讨论和实现也走了一段相对漫长的路。这一路上既有激烈的讨论&#xff0c;也有种种的尝试和迭代。本节将对泛型的基础概念进行深入分析…

看了我项目中购物车、订单、支付一整套设计,同事也开始悄悄模仿了...

在我的mall电商实战项目中&#xff0c;有着从商品加入购物车到订单支付成功的一整套功能&#xff0c;这套功能的设计与实现对于有购物需求的网站来说&#xff0c;应该是一套通用设计了。今天给大家介绍下这套功能设计&#xff0c;涵盖购物车、生成确认单、生成订单、取消订单以…

【Proteus仿真】【Arduino单片机】LED

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LED等。 主要功能&#xff1a; 系统运行后&#xff0c;LED花样显示。 二、软件设计 /* 作者&#xff1a;嗨小易&#xff08;QQ&#xff1a;3…

Arcgis聚合工具——实现简单的升尺度

找到Aggregate工具 按如下设置进行操作 注意&#xff1a;如有需要对应的低分辨率影像&#xff0c;必须点开右下角环境Environments选项&#xff0c;进行栅格的捕捉选项设置&#xff0c;以防止升尺度后的影像与需对应的低分辨率影像的栅格单元存在偏移。 点击OK&#xff0c;即可…

Linux CentOS 8(网卡的配置与管理)

Linux CentOS 8&#xff08;网卡的配置与管理&#xff09; 目录 一、项目介绍二、命令行三、配置文件四、图形画界面的网卡IP配置4.1 方法一4.2 方法二 一、项目介绍 Linux服务器的网络配置是Linux系统管理的底层建筑&#xff0c;没有网络配置&#xff0c;服务器之间就不能相互…

内核IO栈 | IO缓冲区的向下传递过程

最近遇到个这么一个事&#xff0c;查阅SCSI手册&#xff0c;对于READ(10)命令&#xff0c;似乎在采用DMA的情况下&#xff0c;下发的SCSI命令中&#xff0c;并没有内存空间的地址和长度&#xff1a; 也就是说&#xff0c;单纯从这一个命令中&#xff0c;我们并不知道将数据从硬…

MyBatis源码初始

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; MyBatis源码解读 ✨特色专栏&#xff…

首饰上亚马逊合规认证RSL报告

首饰 首饰是一种古老而又流行的装饰品&#xff0c;它们不仅可以点缀女性的美丽&#xff0c;还可以表达个人的品味和风格。首饰的种类繁多&#xff0c;有耳环、项链、手镯、戒指等&#xff0c;每一种都有自己的特点。 随着人们对珠宝首饰的要求越来越高&#xff0c;为了确保珠宝…

uni-app小程序使用DCloud(插件市场)流程

一、DCloud&#xff08;插件市场&#xff09; DCloud 是uni-app官方插件市场&#xff0c;里面有官方、团队、个人发布的众多插件&#xff0c;包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考&#xff0c;但一些团队或个人发布的小型插件没有文档&#xf…

Python调用c++生成的dll

Python调用c生成的dll 1.简单例子1.1 vs2019 c生成dll1.2 Python端调用 2.调用c类生成的dll2.1 vs cpp端生成dll2.2 Python端调用 参考文献 1.简单例子 1.1 vs2019 c生成dll 项目中添加add.cpp文件 extern "C" int __declspec(dllexport) add(int x, int y) {retu…

SpringBoot + Disruptor 实现特快高并发处理,支撑每秒 600 万订单无压力!

背景 工作中遇到项目使用Disruptor做消息队列&#xff0c;对你没看错&#xff0c;不是Kafka也不是rabbitmq。Disruptor有个最大的优点就是快&#xff0c;还有一点它是开源的哦&#xff0c;下面做个简单的记录。 Disruptor介绍 Disruptor 是英国外汇交易公司LMAX开发的一个高…

中国式复杂报表制作工具及技巧,解决90%效率问题

最大的数据杀手——中国式复杂报表 作为资料人&#xff0c;在日常生活和工作之中&#xff0c;我们是否经常被要求制作如下图所示的一些数据统计表格&#xff1a; 总的来看&#xff0c;很多人经常发现自己虽然有数据&#xff0c;却不知道用什么图表来进行数据最佳形式的价值表…

「我在淘天做技术」一篇文章告诉你商品团队在做哪些有意思的事?

作者:许令波(君山) 近期淘天集团秋季 2024 届校园招聘正式启动&#xff0c;预计将发放 2000 多个 offer&#xff0c;其中技术类岗位占比超过 50%。为了方便大家更真实地了解淘天技术的布局和现状&#xff0c;我们策划了「我在淘天做技术」系列&#xff0c;首次全面分享淘天技术…

【限时优惠】RHCE9.0培训考证-红帽官方授权中心

【微|信|公|众|号&#xff1a;厦门微思网络】 官网&#xff1a; www.xmws.cn 相信关注红帽认证的小伙伴都已经知道了&#xff1a;2022 年 5 月 18 日&#xff0c;红帽公司宣布推出红帽企业 Linux 9 (RHCE 9)&#xff0c;这是世界领先的企业 Linux 平台的最新版本。 特别提醒的是…

怎样成功部署CRM销售管理系统?

部署CRM销售管理系统可以是自上而下的落实&#xff0c;也可以自下而上让基层员工提出他们的建议&#xff0c;毕竟他们才是系统的使用者。成功部署CRM销售管理系统离不开以下几点要素&#xff1a; 1、全渠道沟通 在通讯技术发达的今天&#xff0c;人们可以在任何地方进行视频通…

Unity3D Shader新手入门教程:3D溶解与腐蚀特效详解

引言 在游戏开发中&#xff0c;特效是非常重要的一部分&#xff0c;它能够增加游戏的趣味性和可玩性。其中&#xff0c;Shader特效是一种非常常见和常用的特效&#xff0c;它能够通过改变物体表面的渲染方式来实现各种各样的特效效果。本文将详细介绍Unity3D中的Shader 3D溶解与…