题目:
思路:
对于连续的序列,并不要求顺序,往往要想到map来解决。对于要求子数组满足前后顺序的问题,一般需要滑动窗口来解决。本题不要求顺序,所以借助map来解决。
- 将数组中所有的数先用map存储下来
- 遍历数组,对每一个数,将两边扩展并通过map来判断是否存在,每次更新结果保证当前的最大值。
代码:
class Solution {
public:
int longestConsecutive(vector<int>& nums) { //时间复杂度O(n)
if(nums.size()<=0)
return 0;
unordered_map<int,bool> mp;
for(auto i :nums)
{
mp[i] = false;
}
int res = 0;
for(int i=0;i<nums.size();i++)
{
if(mp[nums[i]])
continue;
int count = 1;
mp[nums[i]] = true;
int j = 1;
while(mp.find(nums[i]-j)!=mp.end())
{
count++;
mp[nums[i]-j] = true;
j++;
}
j = 1;
while(mp.find(nums[i]+j)!=mp.end())
{
count++;
mp[nums[i]+j] = true;
j++;
}
res = max(count,res);
}
return res;
}
};