题目:题目链接
思路:最长连续序列,不会。下面介绍一种大神的解法和官方解答。
方法一 大神解法
利用map的有序性,把元素都丢到map里面,然后直接遍历一遍map就可以了。看代码:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if (nums.size() < 2) return nums.size();
map<int, int>mp;
int cnt = 1;
int ans = 1;
for (const auto& num : nums)
mp[num]++;
for (const auto& ele : mp) {
if (mp[ele.first - 1] != 0) cnt++;//是连续的
else {
ans = max(ans, cnt);
cnt = 1;
}
}
return max(ans, cnt);//可能没有访问for中的else
}
};
其实这个复杂度是O(nlogn)的,因为map的插入是O(logn)。不过代码还是很好理解的,和排序后处理的方式差不多。
方法二 官方解答
先丢到set里面,把重复的元素去掉,这一步map也是同样的效果。然后遍历set,对于每一个可能的序列,我们都从最开始的元素访问,也就是说对于一个x1,x2,x3…xn的序列,我们不会访问x2,x3,因为只有从x1开始才是最长的,所以对于一个数x,只有x-1不存在时才从他开始寻找最长序列。看代码吧:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int>num_set;
int longest_streak = 0;
for (const auto& num : nums)
num_set.insert(num);
for (const auto& num : num_set) {
if (num_set.count(num - 1) == 0) {//当num-1不存在时,表面num是一个序列的开头
int current_num = num;//记录当前num
int current_streak = 1;//当前长度
while (num_set.count(current_num + 1)) {//从num开始找连续的一个序列
current_num++;
current_streak++;
}
longest_streak = max(longest_streak, current_streak);//保留最长的
}
}
return longest_streak;
}
};
现在刷100题真的是一题都不会,太菜了。只能看看题解,不是做题是学题啊。
加油加油加油加油!!