体现贪心的“贪”

最长递增子序列

http://www.nowcoder.com/questionTerminal/9cf027bf54714ad889d4f30ff0ae5481

寻找一个最长的递增子序列,应用贪心算法。
什么样的递增子序列最长,或者说有机会最长?子序列的前面的数字越小,往后面拓展时越有可能得到更长的递增子序列。
以题目为例[2,1,5,3,6,4,8,9,7]
我们首先定义一个向量dp,dp的长度代表当前最长的递增子序列长度。dp的元素选取体现我们的“贪心”
遍历原数组arr,放第一个元素到dp中;dp=[2],这时没什么好说的;
然后放arr的第二个元素。第二个元素比dp末尾的2要小,这时候我们直接把2换成1, 因为就目前来看,最长的递增子序列长度只能是1,但是我们要把2换成更小的1,这样子往后面遍历时候,更容易找到比1大的元素,也即找到更长的递增子序列。此时dp变成了[1];
然后我们再考虑arr的第三个元素5,因为5比dp的尾元素1要大,直接把5加入到dp的末尾;
然后再考虑3,3比5小,那么我们就把3替换掉dp中从左往右第一个比3大的元素。这时元素3并没有改变最长递增子序列的长度,而是蛰伏在dp中,如果arr后面有3.1,3.2,3.3,3.4(仅作举例)的话,3是可以发挥作用的。
以此类比,就可以得到最长递增子序列的长度。为了得到具体的子序列,还需要另一个与arr等长的向量place,place记录的是arr对应位置的元素在dp中的位置。
具体代码如下

vector<int> LIS(vector<int>& arr) {
        if(arr.size()<=1)return arr;
        vector<int> dp;
        vector<int> place;
        dp.push_back(arr[0]);
        place.push_back(1);
        for(int i=1;i<arr.size();i++){
            if(arr[i]>=dp.back()){
                dp.push_back(arr[i]);
                place.push_back(dp.size());
            }
            else{
                for(int j=0;j<dp.size();j++)
                    if(dp[j]>arr[i]){dp[j]=arr[i];place.push_back(j+1);break;}
            }
        }
        vector<int> result(dp.size());
        for(int i=dp.size();i>0;i--){
            for(int j=place.size()-1;j>=0;j--){
                if(place[j]==i){result[i-1]=arr[j];place.pop_back();break;}
                place.pop_back();
            }
        }
        return result;
    }
全部评论
1 4 5 3
点赞 回复 分享
发布于 2021-07-20 21:27
有案例过不了
点赞 回复 分享
发布于 2021-07-14 12:09
这个写的比较清楚,第一的解答完全没看懂,_(¦3」∠)_
点赞 回复 分享
发布于 2021-04-17 16:11

相关推荐

2025年初,新的一年开始,我给自己暗暗打气,发誓今年一定要拿到offer。如今2025年即将结束,找工作仍然没有任何水花,如今的失意和落魄和年初信心满满的姿态形成鲜明对比,想必也是因为被社会毒打,认清现实了吧。先分享一下贴主的背景,本人女,本科末流985文科专业,后来保送到华五,成绩一直是班级第一,有过国奖,实习有多段头部大厂经历。发贴的直接原因是今天华为面试挂,在反思中有很多复杂的想法,包括对自身能力的怀疑、对面试官所提问题的不解、对大环境的无奈。贴主是一个说话温柔、不喜欢咄咄逼人、有点社恐的人(基本上算是人们眼中对小女生的刻板印象,所以在历次群面中基本全挂(看到大家争抢当leader、t...
在找内推的小虾米:感觉这一段经历和我好像啊,前段时间面了很多车企,面试项目经历各种被拷打,大多数都没过一面,最有希望拿offer的一个终面挂了把我干破防了,打电话给爸妈哭了一个多小时才缓过来。我也开始否定自己,否定自己的一切,包括性格,能力,成长经历。。。最后面了深圳的某家公司,面试官人都挺友好,提的问题有深度但找到切入点 ,最后hr也按岗位最高的标准给的offer,我才发现自己并没有这么不堪,只是我的能力和经验和之前的岗位要求不那么符合而已。帖主一定不要灰心,招聘的窗口期还有很长很长,保持自信扬长避短,一定有企业能发现你的闪光点,祝好。
我的求职进度条
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-06 20:49
某国企 研发工程师 31W 硕士211
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务