leetcode128. Longest Consecutive Sequence

题目:题目链接

思路:最长连续序列,不会。下面介绍一种大神的解法和官方解答。

方法一 大神解法

利用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题真的是一题都不会,太菜了。只能看看题解,不是做题是学题啊。
加油加油加油加油!!

你可能感兴趣的:(LeetCodeTop100,leetcode,算法,职场和发展)