有意思的一题,首先,时间需要时on,这个时间想到的只有hashmap,treemap不行,因为tree的操作的ologn,hasdmap是o1,然后遍历一次。如果这个数的左右两边没数,则·dp=1
有数的话,就更新一段联系区间的最左右的端点的dp值,dp值表示包括这个数在内的连续最大长度。所以时间上应该是on,其实我觉得是o3n,不过好像题解就是这个方法。。。。
2刷学习一下别人6巷代码的写法
Ps 这题是用unordered_map!!!!!
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_map<int, int>dp;
int maxx = 1;
for(int i = 0; i < nums.size(); ++ i){
if(dp.find(nums[i]) != dp.end()){
continue;
}
int t;
if(dp.find(nums[i] - 1) != dp.end() && dp.find(nums[i] + 1) != dp.end()){
dp[nums[i]] = dp[nums[i] - 1] + dp[nums[i] + 1] + 1;
t = dp[nums[i]];
dp[nums[i] - dp[nums[i] - 1]] = t;
dp[nums[i] + dp[nums[i] + 1]] = t;
}
else if(dp.find(nums[i] - 1) != dp.end()){
dp[nums[i]] = dp[nums[i] - 1] + 1;
t = dp[nums[i]];
dp[nums[i] - dp[nums[i] - 1]] = t;
}
else if(dp.find(nums[i] + 1) != dp.end()){
dp[nums[i]] = dp[nums[i] + 1] + 1;
t = dp[nums[i]];
dp[nums[i] + dp[nums[i] + 1]] = t;
}
else{
dp[nums[i]] = 1;
}
if(maxx < t)
maxx = t;
}
return maxx;
}
};