最长递增子序列

题目描述
给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)
示例1:
输入
[2,1,5,3,6,4,8,9,7]
输出
[1,3,4,8,9]

示例2:
输入
[1,2,8,6,4]
输出
[1,2,4]

说明:其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个字典序最小,故答案为(1,2,4)
解题思路
第一次解题,看了评论区答案,大概意思是用了二分法+动态规划,但是不清楚二分法用在什么地方了(哭)
1:解决两个问题,第一:确定这个子序列的长度;第二是确定序列的具体元素。(难不成这里是二分法?)
2:首先设定两个数组,res[]存放子序列,maxlan[i]存放以第i个元素结尾的最长子序列的长度。将arr[0]写入res,maxlan[0] = 1;
3:遍历传进数组arr的每个元素,判断是否大于res的尾元素,若大于,则直接继续写入,maxlan的大小为res的长度。若不大于,则寻找res中第一个大于arr[i]的元素的位置,并用arr[i]替代,maxlan的大小为此时位置+1;遍历完得到子序列的长度res.size()和以每个元素结尾的最长子序列的长度maxlan。
4:再次遍历每一个元素,从后向前遍历,判断maxlan[i]中的 元素与是否是第j个元素。(其实有点难理解,要用例子说明)。如果相等的话,则将这个元素存储到res相应的位置上。

class Solution {
public:
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型vector the array
     * @return int整型vector
     */
    vector<int> LIS(vector<int>& arr) {//传入的是数组,返回的也是数组

        vector<int > res;
        vector<int> maxlan;
        if(arr.size()<1) return res;
        res.emplace_back(arr[0]);//emplace_back和push_back的作用相同。
        maxlan.emplace_back(1);
        for(int i=1;i<arr.size();i++){
            if(arr[i]>res.back()){
                res.emplace_back(arr[i]);
                maxlan.emplace_back(res.size());
            }else{
                int pos = lower_bound(res.begin(), res.end(), arr[i])-res.begin();
//这个函数lower_bound(),是找到数组从开始到结尾第一个比arr[i]大的元素的位置,
//减去首元素的位置是因为有时候begin并不是首元素。(好像又把自己绕进去,要重新思考的)
                res[pos] = arr[i];
                maxlan.emplace_back(pos+1);
            }
        }
        for(int i=arr.size()-1,j=res.size();j>0;--i){
            if(maxlan[i] == j){
                res[--j] =arr[i];//--j是因为如果res长度是3,最后一个元素应该是res[2].
            }
        }
        return res;
    }
};
全部评论

相关推荐

双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务