题目描述:
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入:[100, 4, 200, 1, 3, 2]
输出:4
即最长的连续序列为 [1,2,3,4]
思路分析:
由于要求O(n)的复杂读,因此直接排序是不可行的。
这里用到的是并查集的思想。对于每一个数,去查小于1和大于1的数是否在序列中。通过迭代求解。
尽管在 for 循环中嵌套了一个 while 循环,时间复杂度看起来像是二次方级别的。但其实它是线性的算法。因为只有当 currentNum 遇到了一个序列的开始, while 循环才会被执行(也就是 currentNum-1 不在数组 nums 里), while 循环在整个运行过程中只会被迭代 n 次。这意味着尽管看起来时间复杂度为 O(n⋅n) ,实际这个嵌套循环只会运行 O(n + n) =O(n) 次。所有的计算都是线性时间的,所以总的时间复杂度是 O(n)的。
代码:
1 class Solution { 2 public: 3 int longestConsecutive(vector<int>& nums) { 4 if(nums.size()==0) 5 return 0; 6 int ans = 0; 7 unordered_set<int> myset(nums.begin(), nums.end()); 8 for(int i = 0; i<nums.size(); i++) 9 { 10 if(myset.count(nums[i]-1)==0) 11 { 12 int x = nums[i]+1; 13 while(myset.count(x)) 14 { 15 x++; 16 } 17 ans = max(ans, x-nums[i]); 18 } 19 20 } 21 return ans; 22 } 23 };