Longest Consecutive Sequence

来源:互联网 发布:数据库结构的三个模式 编辑:程序博客网 时间:2024/03/29 15:27

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

思路一:把数据放在set中达到找每个数字的下一个连续数字只需要O(1)的目的。然后对于每一个元素找到所有连续后继,直到set中不存在它可以链到的后继,对于访问过的数字,从set中移除,因为比较大的数字的连续后继数的数目肯定小于它的前驱数字的,所以不需要重复计算。而对于某个数字,如”链到“的某个后继的连续后继数字的数目已知,就可以直接用当前计算到的”链长“加上后继的连续后继数字的数目得到,这样,虽然代码看似有两重循环,实际每个数字只会被访问一次,所以是O(n)复杂度的。

代码如下:

class Solution {      public:          int longestConsecutive(vector<int> &num) {              // Start typing your C/C++ solution below              // DO NOT write int main() function              unordered_set<int> num_set;            num_set.insert(num.begin(),num.end());                             map<int,int> next_num_map;            int max_len = 0;            unordered_set<int>::iterator it1 = num_set.begin();            while(it1 != num_set.end())             {                  int cnt = 0;                  int number = *it1;                  int number2 = number;                unordered_set<int>::iterator it2 = num_set.find(++number);                            while( it2 != num_set.end())                  {                       cnt++;                       num_set.erase(number);                     map<int,int>::iterator it3 = next_num_map.find(number);                     if( it3 != next_num_map.end()) {                          cnt += it3->second;                          break;                      }                      it2 = num_set.find(++number);                         }                                    next_num_map.insert(pair< int,int >(number2,cnt));                      max_len = max(max_len,cnt+1);                  it1++;            }                  return max_len;          }      };  

72 milli secs

方法二:use HashSet, pick one element V from Set, check whether V+1 and V-1 is in Set

class Solution {      public:          int longestConsecutive(vector<int> &num) {        // Start typing your C/C++ solution below        // DO NOT write int main() function            unordered_set<int> s(num.begin(), num.end());            int max_length = 0;            while(!s.empty()) {                int value = *s.begin();                int upper_bound = value;                int lower_bound = value;                int length = 1;                s.erase(value);                while(s.find(upper_bound+1) != s.end()) {                    upper_bound++;                    length++;                    s.erase(upper_bound);                }                while(s.find(lower_bound-1) != s.end()) {                    lower_bound--;                    length++;                    s.erase(lower_bound);                }                if (length > max_length) {                    max_length = length;                }            }            return max_length;        }    }; 

60 milli secs


更简单的代码,回头看一下

http://blog.sina.com.cn/s/blog_b9285de20101iqar.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 360n5手机耗电快怎么办 怪兽充电宝丢了怎么办 有已处置的评价怎么办 淘宝降权了怎么办2018 使用虚假广告词被工商查到怎么办 为什么手机淘宝店关注不了怎么办 淘宝买东西付钱后卖家不发货怎么办 微信销售群没人买东西怎么办 淘宝想开2个店铺怎么办 拼多多没钱交保证金怎么办 差评一个月后怎么办 淘宝买家投诉成立后怎么办 天猫投诉成立了怎么办 新开实体店铺没生意怎么办 新开淘宝没流量怎么办 白色板鞋有青草弄的绿色怎么办 淘宝租衣服不退押金怎么办 c盘不可以扩展怎么办 实践教学管理平台忘记账号怎么办 淘宝申请售后店家不处理怎么办 全民k歌地区限制怎么办 网络电视hdp无法下载怎么办 淘宝店铺销量为零怎么办 快递号填错卖家拒绝退款申请怎么办 淘宝店代购 售假怎么办 淘宝申请售后卖家没钱怎么办 淘宝禁止评价一个月怎么办 被卖家电话骚扰怎么办 恶意骚扰扣12分怎么办 新店开张交保证金被骗了怎么办 支付宝蚂蚁花呗逾期怎么办 被注销的微信怎么办 花呗有些不能用怎么办 实体店生意不好做怎么办 电器实体店生意越来越差怎么办 开业第一天不吉利怎么办 美容店开业第一天没人怎么办 淘宝店铺没有人访问怎么办 淘宝店铺没有人问怎么办 淘宝申请退款后店铺关闭怎么办 宝贝详情怎么改不了怎么办