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

128. 最长连续序列

给定一个无序数组,要求最长连续序列,要求O(n)解决

第一种:O(nlogn)

        样例比较水可以勉强通过,使用set去重加排序,遍历去重后的数组,如果当前元素是上一个元素+1,那么最长序列长度加一

class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.size()==0) return 0;set<int> s;for(auto it:nums) s.insert(it);nums.clear();for(auto it:s) nums.push_back(it);vector<int> dp(nums.size(),1);int ans = 1;for (int i = 1;i <nums.size();i++) {if (nums[i] == nums[i - 1] + 1) dp[i] = dp[i - 1] + 1;ans = max(ans,dp[i]);}return ans;}
};

第二种:

        想要达到O(n)时间复杂度是不能用排序的,因为排序的时间复杂度是O(nlogn),我们可以使用哈希集合对是否存在某个元素进行O(1)判断,如果x-1存在,那么不以x为序列开头,因为x-1可以得到的最长连续序列一定比x长,例如3 1 2 4,以3开头最长获得2,2开头最长获得3。

        具体思路:将nums转换为哈希集合,对x-1进行存在判断,如果存在,继续找x-1-1是否存在,如果不存在,那么他就是以x开头的最长连续序列,之后对x+1,x+1+1,进行存在判断即可

        代码:

class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> st(nums.begin(),nums.end());int ans = 0;for (auto x:st) {if (st.contains(x - 1)) continue;int y = x + 1;while (st.contains(y)) {y++;}ans = max(ans,y - x);//y-1 到 x 有y - x个数}return ans;}
};

时间复杂度:O(n),n为nums的长度,也可以是nums中不重复元素的个数,在二重循环中,每个元素最多被遍历两次O(2*n) = O(n),一次在遍历集合,一次在遍历x+1

http://www.xdnf.cn/news/278497.html

相关文章:

  • 【人工智能】大模型安全的深度剖析:DeepSeek漏洞分析与防护实践
  • 牛客周赛91 D题(数组4.0) 题解
  • 如何用更少的显存训练 PyTorch 模型
  • 【Java JUnit单元测试框架-60】深入理解JUnit:Java单元测试的艺术与实践
  • Spring AI 实战:第九章、Spring AI MCP之万站直通
  • HTML5实战指南:语义化标签与表单表格高级应用
  • AI日报 · 2025年5月04日|Hugging Face 启动 MCP 全球创新挑战赛
  • 《工业社会的诞生》章节
  • 相向双指针-16. 最接近的三数之和
  • 基于AWS Marketplace的快速解决方案:从选型到部署实战
  • OpenFAST 开源软件介绍
  • 大学之大:高丽大学2025.5.4
  • Java并发编程-多线程基础(三)
  • 在 Ubuntu 系统中,查看已安装程序的方法
  • Redis-----认识NoSQL
  • 网络开发基础(游戏)之 心跳机制
  • C++ 多态:原理、实现与应用
  • 科学养生,健康生活
  • Python容器与循环:数据处理的双剑合璧
  • 虚函数 vs 纯虚函数 vs 静态函数(C++)
  • 原型模式(Prototype Pattern)
  • drawDB:打造高效数据库设计流程
  • Go-Spring 全新版本 v1.1.0
  • 潮乎盲盒商城系统全开源多级分销推广海报奖品兑换试玩概率OSS云存储多端源码
  • 工业大模型:从设备诊断到工艺重构
  • 从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 3 |混合定位实战:Wi-Fi RTT / LoRa / BLE RSSI AoA 多源融合
  • node.js为什么产生?
  • Qt基础知识记录(终篇)
  • 前端面试每日三题 - Day 24
  • SpringCloud教程 — 无废话从0到1逐步学习