当前位置: 首页 > news >正文

力扣hot100——最长连续序列(哈希unordered_set)

题目链接:最长连续序列

1、错解:数组做哈希表(内存超出限制)

int longestConsecutive(vector<int>& nums) {
        vector<bool> hash(20000000010, false);
        for(int i=0; i<nums.size();i++)
        {
            hash[1000000000+nums[i]]=true;
        }
        int maxLen=1;
        for(int i=0;i<hash.size()-1; i++)
        {
            if(hash[i]==true && hash[i+1]==true)
            {
                maxLen++;
            }
            else
            {
                maxLen=1;
            }
        }
        return maxLen;
    }

2、使用unordered_set实现将数组映射到哈希表。不能用set,因为set的底层实现是红黑树,查询效率和插入效率都是O(logn)。unordered_set的查询效率和插入效率都是O(1)。

核心思路:对于 nums 中的元素 x,以 x 为起点,不断查找下一个数 x+1,x+2,⋯ 是否在 nums 中,并统计序列的长度。

为了做到 O(n) 的时间复杂度,需要两个关键优化:

把 nums 中的数都放入一个哈希集合中,这样可以 O(1) 判断数字是否在 nums 中。
如果 x−1 在哈希集合中,则不以 x 为起点。为什么?因为以 x−1 为起点计算出的序列长度,一定比以 x 为起点计算出的序列长度要长!这样可以避免大量重复计算。比如 nums=[3,2,4,5],从 3 开始,我们可以找到 3,4,5 这个连续序列;而从 2 开始,我们可以找到 2,3,4,5 这个连续序列,一定比从 3 开始的序列更长。
int longestConsecutive(vector<int>& nums) {
        unordered_set<int> hash(nums.begin(), nums.end());
        int maxLen=0;
        for(unordered_set<int>::iterator it = hash.begin(); it!=hash.end(); it++)
        {
            //找到序列中最小的元素
            if(hash.contains(*it-1))
            {
                continue;
            }
            //*it是序列的起点
            int y=*it+1;
            // 不断查找下一个数是否在哈希集合中
            while(hash.contains(y))
            {
                y++;
            }
            maxLen=max(maxLen, y-*it);
        }
        return maxLen;
    }

作者:灵茶山艾府
链接:https://leetcode.cn/problems/longest-consecutive-sequence/solutions/3005726/ha-xi-biao-on-zuo-fa-pythonjavacgojsrust-whop/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

  • 力扣 第 153 场双周赛 讲题
  • 【redis】集群 数据分片算法:哈希求余、一致性哈希、哈希槽分区算法
  • 通过万能SPI设备驱动spidev.c来操作挂接在SPI总线上的SPI设备(DAC模块)【spidev.c代码详解、SPI控制器及SPI设备的设备树语句解析】
  • 工具——(常用的软件)视频编辑器
  • UE5学习笔记 FPS游戏制作31 显示计分板
  • Qt进阶开发:对象树与拥有权
  • 26考研——排序_插入排序(8)
  • J2EE框架技术 第一章 SSM框架搭建
  • maxDataPointsPerRollingArg must be at least 1
  • 斐波那契数列----C语言
  • ⭐算法OJ⭐俄罗斯套娃信封问题【排序 + LIS】Russian Doll Envelopes
  • AF3 process_tensors_from_config函数解读
  • True strength lies in embracing vulnerability as a gateway to growth.
  • 清晰易懂的TypeScript安装与开发环境配置教程
  • 主流云厂商的云原生技术栈(Cloud-native stack)及其核心组件对比
  • AIGC1——AIGC技术原理与模型演进:从GAN到多模态融合的突破
  • 备份是个好习惯
  • Android学习总结之通信篇
  • 基于 vue 做数字滚轮效果
  • UE5学习笔记 FPS游戏制作26 UE中的UI
  • 网站学做糕点的课程/搜索引擎有哪些分类
  • 网站建设的可行性报告范文/搜索引擎营销优缺点
  • 深圳国内网站制作哪家快/上海全网营销推广
  • 做环球资源网站有没有效果/优化大师下载安装
  • 沈阳市做网站电话/成都今天宣布的最新疫情消息
  • wordpress 分类文章排序/长沙网站seo优化排名