海口平台公司站内优化
可以用哈希表解决,先遍历选取每一个元素num作为起始值,然后判断num+1是否也在数组中,如果在就序列长度+1,但是用哈希表这么做实际上时间复杂度为o(n^2),为了降低到n,每一个元素只能访问一次,那么也就是如果num做为起始值,那么他的前驱num-1是不能在数组中的,这样就可以避免重复访问
class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> numSet;for(const int& num:nums)numSet.insert(num);int result=0;for(const int& num:nums){if(numSet.find(num-1)!=numSet.end())continue;else{int len=1;int currentNum=num;while(numSet.find(currentNum+1)!=numSet.end()){len++;currentNum++;}result=max(result,len);}}return result;}
};
然而虽然代码和官方差不多还是有用例超时,对于如下这种有m个0的如果作为起始值,后续还有1,2,3,4让其进入内层循环的,时间复杂度为o(mn),为了避免这种情况还得对0去重
class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> numSet;for(const int& num:nums)numSet.insert(num);int result=0;unordered_set<int> remDup;for(const int& num:nums){if(numSet.find(num-1)!=numSet.end()||remDup.find(num)!=remDup.end())continue;else{remDup.insert(num);int len=1;int currentNum=num;while(numSet.find(currentNum+1)!=numSet.end()){len++;currentNum++;}result=max(result,len);}}return result;}
};