题解 | #最长递增子序列#

最长递增子序列

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

贪心+二分
(1)首先,数据范围,完全的dp做法时间复杂度为,肯定超时;
(2)设数组为当前长度为可能的最大递增子序列(不一定是字典序最小的!),可能的原因是该求法可以得到最大递增子序列的最大长度,但是保存的未必是子序列!可以模拟看下样例,以及的过程;
(3)我们贪心地希望能够更长,那么希望已经构成的元素更小!
(4)所以二分从中找第一个大于等于的元素替换,如果没有就说明需要更新长度;
(5)以上做法是标准的贪心+二分求最长递增子序列的长度的做法,本题需要得到最小字典序的子序列,所以在以上基础上进行修改;
(6)我们需要记录表示以当前元素为结尾的最长递增子序列的长度!
(7)根据我们逆序地从最大长度开始遍历,即满足curLen[i] == ans条件的元素,就是长度为ans的字典序最小的方案,即可得到答案;
具体可以拿样例测一下,理解下原理;
时间复杂度:
空间复杂度:

class Solution {
public:
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型vector the array
     * @return int整型vector
     */
    vector<int> LIS(vector<int>& arr) {
        // write code here
        int n = arr.size();
        vector<int> tail(n); //贪心的希望末尾的数字越小越好
        vector<int> curLen(n); //arr的第i个元素对应的最大递增子序列长度
        int ans = 0;
        for(int i = 0; i < n; i ++){
            int left = 0, right = ans;
            while(left < right){ //找第一个大于等于arr[i]的位置
                int mid = left + (right - left) / 2;
                if(tail[mid] >= arr[i]) right = mid;
                else left = mid + 1;
            }
            tail[left] = arr[i];
            curLen[i] = left + 1; //当前元素对应最大递增子序列的长度
            if(left == ans) ans ++;
        }
        vector<int> res(ans);
        for(int i = arr.size() - 1, j = ans; i >= 0; i --){
            if(curLen[i] == j) res[-- j] = arr[i];
        }
        return res;
    }
};
全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
秋招投简历提醒助手:个人经验是,一般面二十场左右就会进入侃侃而谈阶段。我今年七月末的时候开始的第一次面试,都是很多不会,回复很慢。后面慢慢迭代,到九月中的时候基本上面啥说啥,很放松的状态
远程面试的尴尬瞬间
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

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