力扣HOT100之哈希:128. 最长连续序列

这道题我想的比较简单,先遍历一遍输入的数组,然后将读取到的数字存入一个map容器中(注意,不是unordered_map),数字作为键,布尔变量为值,然后再遍历一遍map,用一个变量temp记录上次循环读取到的值,temp_result用来记录当前遍历到的子序列的长度,一旦遇到当前遍历到的值与上一次遍历到的值不连续的情况,立马将temp_result置为1,然后继续向后遍历,在每次循环中,最终返回的值result与temp_result比较大小,将较大值作为result的新值。

cpp 复制代码
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int result = 0;
        map<int, bool> hash;
        for(int& i : nums)
            hash[i] = true;
        int temp;
        int temp_result = 0;
        for(auto it = hash.begin(); it != hash.end(); it++){
            if(it == hash.begin()){
                temp_result++;
            }
            else{
                if(temp == it -> first - 1)
                    temp_result++;
                else{
                    temp_result = 1;
                }
            }
            temp = it -> first;
            result = max(result, temp_result);
            cout << it -> first << endl;
        }
        return result;
    }
};

果不其然,通过是通过了,但是耗时太长了,不符合O(n)的时间复杂度要求,后面看了下灵茶山大佬的题解,重新做一遍。

先说下主要原理:先利用unordered_set构建哈希表,然后遍历哈希表中的每一个元素,当遍历到一个元素时,先判断当前元素的上一个元素是否在哈希表中,如果在,就直接跳过本次循环,开启下一次循环,当出现当前元素的上一个元素不在哈希表中时,说明上一段连续的学列已经遍历结束,开启一段新的序列,此时不再跳过循环,而是定义一个循环,在循环内不断查找从当前元素起的最长连续序列,当该循环结束时意味着当前元素为起点的连续序列已经查找完毕,将最后一个元素的数值减去当前元素的值即为当前元素为起点的连续序列长度,再将该长度与之前保存的最长连续子序列的长度作比较,取较大值为新的最长连续子序列的长度。由于哈希表的查找耗时为O(1),虽然代码中写的是一个类似二重循环的结构,但是这个二重循环在大多数情况下会退化为一重循环,经历若干次查找,时间复杂度为O(n)。

cpp 复制代码
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int result = 0;
        unordered_set<int> hash(nums.begin(), nums.end());  //通过集合来构建哈希表
        for(const int& i : hash){
            if(hash.find(i - 1) != hash.end())  //确保当前遍历到的元素和上一个元素是连续的
                continue;
            //以下是当前元素与上一个元素不连续的情况
            int j = i + 1;
            while(hash.find(j) != hash.end())   //该循环用于寻找从当前元素起的连续元素个数
                j++;
            result = max(result, j - i);
        }
        return result;
    }
};

这道题还是有难度的。

相关推荐
艾莉丝努力练剑4 分钟前
【LeetCode&数据结构】二叉树的应用(二)——二叉树的前序遍历问题、二叉树的中序遍历问题、二叉树的后序遍历问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
YuTaoShao12 分钟前
【LeetCode 热题 100】51. N 皇后——回溯
java·算法·leetcode·职场和发展
26 分钟前
3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
算法·3d·unity·c#·游戏引擎·sat
Tony沈哲31 分钟前
OpenCV 图像调色优化实录:基于图像金字塔的 RAW / HEIC 文件加载与调色实践
opencv·算法
我就是全世界1 小时前
Faiss中L2欧式距离与余弦相似度:究竟该如何选择?
算法·faiss
boyedu1 小时前
比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
算法·区块链·共识算法·数字货币·加密货币
KarrySmile2 小时前
Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
算法·链表·面试·双指针法·虚拟头结点·环形链表
花开富贵ii2 小时前
代码随想录算法训练营二十八天|动态规划part01
java·数据结构·算法·leetcode·动态规划
啊阿狸不会拉杆2 小时前
《Java 程序设计》第 7 章 - 继承与多态
java·开发语言·jvm·算法·intellij-idea
技术卷2 小时前
详解力扣高频SQL50题之1164. 指定日期的产品价格【中等】
sql·leetcode·oracle