最长连续序列
描述 给定一个未排序的整数数组,找出最长连续序列的长度。 说明 要求你的算法复杂度为O(n) 样例 给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4一开始用的map,改成unordered_map之后会快10%左右
class Solution { public: /** * @param nums: A list of integers * @return an integer */ int longestConsecutive(vector<int> &num) { // write you code here unordered_map<int,int> len; int max=0; for(auto i:num) { if(len[i]==0)//避免重复元素 { int l=len[i-1],r=len[i+1]; len[i]=l+r+1; len[i+r]=l+r+1; len[i-l]=l+r+1; max=max>len[i]?max:len[i]; } } return max; } };放了一个多月回来一看竟然没看懂,看来思路还是要多写下来。 题目要求取最长连续序列,意思是求数字是连着的序列,不是上升子序列什么的。 做法:若数字i左右存在临近序列,则合并i-1,i,i+1分别所在序列,由于只求长度,则只需要记录当前数字i所在序列的长度作为map的value,合并后只需更新合并后序列的最左和最右端的value。 当数字i左右一端或者两端都没有临近序列时,由于len[i-1]和len[i+1]都为0,所以可以直接往上加,省去判断过程。