code第一部分数组:6 数组中最长连续序列
code第一部分数组:6 数组中最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example, Given [100, 4, 200, 1, 3, 2], e longest consecutive elements sequence is [1,
2, 3, 4]. Return its length: 4.
Your algorithm should run in O(n) complexity
老样子,先分析,还是先不考虑约束条件,解决题目了再说;
解决方案1
先排序,直接调用STL中sort函数排序,再遍历查找最长的连续子序列;时间复杂度为O(n²)
解决方案2
使用hash表;用一个哈希表 unordered_map<int, bool> used 记录每个元素是否使用,对每个元素,以该
元素为中心,往左右扩张,直到不连续为止,记录下最长的长度。时间复杂度为O(1)
#include <iostream> #include <map> #include <algorithm> using namespace std; int longestConsecutive1(int a[],int n) { sort(a,a+n); int longest=0; int i; for (i = 0; i < n; i++) { int length=1; int j; for (j = i+1; j<n; j++) { if (a[j]==a[j-1]+1) { length++; } else break; } int k; for (k = i-1; k>=0; k--) { if (a[k]==a[k+1]-1) { length++; } else break; } longest=max(longest,length); } return longest; } int longestConsecutive(int a[],int n) { map<int,int> mp; int i; for(i=0;i<n;i++) mp[a[i]]=1; int res=0; for(i=0;i<n;i++) { int sum=1; if(mp.count(a[i])) { mp[a[i]]=0; int left=a[i]-1; while(mp.count(left)&&mp[left]!=0) { mp[left--]=0; sum++; } int right=a[i]+1; while(mp.count(right)&&mp[right]!=0) { mp[right++]=0; sum++; } } if(res<sum) res=sum; } return res; } int main() { int a[7]={100,4,200,3,1,2,5}; int ans1=longestConsecutive1(a,7); cout<<"ans1 is "<<ans1<<endl; int ans2=longestConsecutive(a,7); cout<<"ans2 is "<<ans2<<endl; }
测试通过!