题解 | #数组中的最长连续子序列#

数组中的最长连续子序列

http://www.nowcoder.com/practice/eac1c953170243338f941959146ac4bf

数组中的最长连续子序列
题意
给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)

输出描述:
输出数组中最大的连续子序列长度

示例
输入:[100,4,200,1,3,2]
返回值:4

方法一 排序,模拟

由题意可知要求的连续值位置并不影响先后顺序,所以先对原数组进行排序,之后遍历一遍取前后差值为1的最长序列,其中要忽略前后值相同的情况。
图片说明

int MLS(vector<int>& arr) {
        // write code here
        sort(arr.begin(), arr.end());    //排序序列
        int ans = 1, q = 1,len = arr.size();;
        for(int i = 1; i < len; i ++){    //遍历序列
            if(arr[i] == arr[i - 1]) continue; //如果当前值与前一个值相等则不做操作
            if(arr[i] - arr[i - 1] == 1){    //当前值与前一个值相差1说明值连续
               if(ans < ++q) ans = q;    //更新答案
            }else q = 1;
        }
        return ans;
    }

时间复杂度: 排序与遍历总体复杂度为
空间复杂度: 只使用若干个变量

方法二 STL(set)

set类可以去除重复元素以及使容器内的元素有序,根据第一种方法的思想将set中的容器按次序取出判断即可。

int MLS(vector<int>& arr) {
        // write code here
        set<int> st;
        for(auto x: arr) st.insert(x);    //将序列所有元素插入set中
        int ans = 1, q = 1, pre = *st.begin();
        st.erase(pre); 
        while(st.size()){ //遍历set中所有元素
            int now = *st.begin();
            st.erase(now);
            if(now - pre == 1 ) { //如果set前后相差为1说明两个数连续
                if(ans < ++ q) ans = q;    //更新答案
            }else q = 1; 
            pre = now;
        }
        return ans;
    }

时间复杂度: set插入和删除复杂度都为
空间复杂度: set集合中所有的元素

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务