題目:
思路:
對於連續的序列,並不要求順序,往往要想到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;
}
};