数组中最长连续序列

来源:互联网 发布:澳大利亚mac口红便宜么 编辑:程序博客网 时间:2024/05/17 06:44

给定无序数组arr, 返回其中最长的连续序列的长度

举例
a[7] = {2,3,4,1,5,7,100},最长的连续序列为[1,2,3,4,5],所以返回5.

本文先假设此数组是有序的,其基本思路如下:

简单来说,排序后我们只要遍历数组,检查当前值减1是否等于上一个值,如果等,增加当前连续序列的计数;如果不等,将当前计数与当前最大值比较,如果更优替换最大值, 并重置计数为1。具体到细节上,我们还要考虑几个问题:

  • 第一个数

处理第一个数时是没有上一个值的。有人可能觉得可以给存储上一个值的变量赋一个特别的初始值来表示处理的是第一个数。但是由于数组内元素的取值范围是所有的整数,不可能找出一个特别的值。所以代码中需要对第一个数做特殊的判断

  • 重复的数

数组中可能会有重复的数,所以我们不能光判断当前值减1等于或不等于上一个值。还需要加上一个等不等与上一个值的判断,如果等,说明是一个重复的数字,直接不做任何处理跳到数组中的下一个数。

  • 最后一组连续序列

由于我们只在遍历中发现当前值减1不等于上一个值时才尝试更新序列长度最大值。如果有一个连续序列一直持续到数组中的最后一个元素,这个序列的长度是没有得到处理的。因此我们需要在遍历完数组后再尝试更新依稀最大值。

C++代码如下:

#include <stdio.h>#include <iostream>#include <vector>#include <unordered_map>#include <algorithm>using namespace std;int sortLongestConsecuive(vector<int> arr){    sort(arr.begin(), arr.end());    int cur = 0;    int max = 0;    int tmp;for (int i = 0; i < arr.size(); i++){    if (i == 0)        cur++;    else    {    if (arr[i] == tmp)        continue;    else if(arr[i] == tmp + 1)        cur++;    else       {    if(cur > max)        max = cur;       cur = 1;       }    }    tmp = arr[i];}if(max < cur)        max = cur;return max;}int main(){    int a[7] = {2,3,4,1,5,7,100};    vector<int> arr(7) ;    for(int i = 0; i < 7; i++)        arr[i] = a[i];    int num;    //num = longestConsecuive(arr);    num = sortLongestConsecuive(arr);    cout<<num<<endl;return 0;}

本题目利用哈希表可以实现时间复杂度为O(N)、额度空间为O(N)的方法,程序中的具体步骤如下:
求解函数(数组)

遍历数组生成哈希表

遍历数组

序列长度1 = 找连续序列函数(当前值,增加方向)序列长度2 = 找连续序列函数(当前值 - 1,减少方向)如果序列长度1 + 序列长度2 > 当前最长序列,更新最长序列

遍历结束

求解函数结束

int longestConsecuive(vector<int> arr){    int maxnum = 0;    unordered_map<int, int> mp;    if(arr.size() == 1)        return 1;    for (int i = 0;i < arr.size(); i++)        mp[arr[i]] = 1;    for(int i = 0; i<mp.size(); i++)    {    int num = 1;    if(mp.count(arr[i]))    {    int left = arr[i] - 1;    while (mp.count(left) && mp[left] != 0)    {    num++;    mp[left--] = 0;    }       int right = arr[i] + 1;    while(mp.count(right) && mp[right] != 0)    {    num++;    mp[right++] = 0;    }    }    if(num > maxnum)         maxnum = num;    }return maxnum;}

部分参考:http://www.tuicool.com/articles/B7FBb2

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 跟朋友买手机买到假货怎么办 在淘宝网上买到不合格的产品怎么办 淘宝打假师打了我的店铺怎么办 收藏品公司关门跑路员工怎么办 客户快递签收后说货物短缺怎么办 京东商城买东西商家不换货怎么办 在商场买东西过几天就降价了怎么办 天猫买东西不退货不退款怎么办 买买8p美版的怎么办 京东金条银行卡被冻结还不了怎么办 在瑞士刚买的浪琴手表不走了怎么办 刚买的手表表镜有划痕 怎么办 唯品会上买的手表有质量问题怎么办 我买的对方材料没开票给我怎么办 给对方修完车车主不给发票怎么办 买苹果手机花呗额度不够怎么办 苹果手机用别人的手机卡激活怎么办 小米商城花呗分期额度不够怎么办 淘宝已经形成订单商家不发货怎么办 小米商城退款后又想买了怎么办 淘宝退货退款后不想退了怎么办 在转转的商品被屏了怎么办 不懂如何挑选适合自己的衣服怎么办 淘宝购买商品给顾客造成损失怎么办 微信购物地址写错了怎么办 微信购物后一直不发货怎么办 微信购物不发货也不退款怎么办 淘宝退货不小心点了确认收货怎么办 外卖不小心点了确认收货怎么办 圆通快递单号查不到物流信息怎么办 在京东买东西没收到退回去了怎么办 我的东西没收到退回去了怎么办 快递丢了快件丢失了快递公司怎么办 在天猫超市买东西订单关闭了怎么办 淘宝上退货店家收到货不理怎么办 淘宝申请退货退款卖家拒绝怎么办 闲鱼退货卖家拒绝退款怎么办 淘宝退货店家收到货不退款怎么办 卖家拒绝申请我退货了怎么办 衣服洗了卖家拒绝退货怎么办 在京东买的小米手机屏摔碎了怎么办