题解 | #C++实现数组中的最长连续子序列#

数组中的最长连续子序列

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

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

//重点是当前序列的最小值和最大值以及当前序列的长度
//一旦序列长度发生改变,只需要更改最大值和最小值对应的value
//最终返回当前序列的长度
//最终求得最长的序列长度

int merge(map<int, int> &mp, int less, int more)
{
    int left = less - mp[less] + 1;//当前序列中最小的数据
    int right = more + mp[more] - 1;//当前序列中最大的数据
    int len = right - left + 1;//当前序列的长度
    mp[left] = len;//在最小值上更新当前序列的长度
    mp[right] = len;//在最大值上更新当前序列的长度
    return len;//返回当前的序列长度
}
int main()
{
    int num;
    while (cin >> num)
    {
        int ret = 1;
        vector<int>arr;
        //接收数据
        for (int i = 0; i < num; i++)
        {
            int n;
            cin >> n;
            arr.push_back(n);
        }
        //创建map
        map<int, int> mp;
        for (int i = 0; i < num; i++)
        {
            if (mp.find(arr[i]) == mp.end())
            {
                //插入未出现的数据
                mp.insert({ arr[i],1 });
                //如果有比当前数据小1的数据已经存在,则把当前数据连接到已有序列最后
                if (mp.find(arr[i] - 1) != mp.end())
                {
                    ret = max(ret,merge(mp,arr[i]-1,arr[i]));
                }
                //如果有比当前数据大1的数据已经存在,则把当前数据连接到已有序列最前方
                if (mp.find(arr[i] + 1) != mp.end())
                {
                    ret = max(ret, merge(mp, arr[i], arr[i]+1));
                }
            }
            else
                continue;
        }
        cout << ret << endl;
    }
    return 0;
}
全部评论

相关推荐

offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务