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

LeetCode128.最长连续序列

 我这个方法有点投机取巧了,题目说时间复杂度最多O(n),而我调用了Arrays.sort()方法,他的时间复杂度是n*log(n),但是AC了,这样的话这道题还是非常简单的,创建一个Hashmap,以nums数组的元素作为key,以这个元素是连续序列中的第几个作为value,先把数组排一下序,然后从第一个开始往后遍历,如果map中有nums[i]这个key,可以直接跳过看下一个元素,如果没有这个key那就看有没有nums[i]-1这个key,也就是看nums[i]前面这个数有没有在数组中,如果有拿到这个nums[i]-1这个key的value,说明nums[i]-1在序列中的第value个,那么nums[i]就在序列中的第value+1个,map.put(nums[i],value+1),同时维护一个ans,表示数组中最大的序列,看看value+1是不是比ans大,如果是则更新ans。如果map中没有nums[i]-1这个key,说明nums[i]前面的序列已经断掉了,以num[i]为起点重新建一个序列,那么num[i]就是序列中的第1个,所以map.put(nums[i],1),以下是我的代码:

class Solution {public int longestConsecutive(int[] nums) {if(nums.length == 0)return 0;HashMap<Integer,Integer> map = new HashMap<>();int ans =1;Arrays.sort(nums);for(int i=0;i<nums.length;i++){if(map.containsKey(nums[i])){continue;}else{if(map.containsKey(nums[i]-1)){int value = map.get(nums[i-1])+1;map.put(nums[i],value);if(value > ans)ans=value;}else{map.put(nums[i],1);}} }return ans;}
}

看了一下题解,题解用的是Hashset。

class Solution {public int longestConsecutive(int[] nums) {Set<Integer> num_set = new HashSet<Integer>();for (int num : nums) {num_set.add(num);}int longestStreak = 0;for (int num : num_set) {if (!num_set.contains(num - 1)) {int currentNum = num;int currentStreak = 1;while (num_set.contains(currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = Math.max(longestStreak, currentStreak);}}return longestStreak;}
}

他先把数组中的所有数全放进set里面,然后遍历set中的num,看看set中有没有num的前1个数num-1,如果没有,说明num就是一个序列的起点,把这个序列的长度先初始为1,然后用一个while循环去看看有没有num的下一个数,如果有的话,序列长度+1,num变为他的下一个数,没有的话循环结束,每次循环都更新longestStreak,最后返回longestStreak即可。

说实话我看完也有点疑惑,外层这个循环已经是O(n)了,里面还有一个while循环,这不是超了吗?好像是for里面只有几个序列的起点会进去,然后while里面也只有起点后面的几个数会进去,然后时间复杂度是O(2n)也就是O(n)。

http://www.lryc.cn/news/131292.html

相关文章:

  • Datawhale Django入门组队学习Task02
  • PCTA 认证考试高分通过经验分享
  • [Python]pytorch与C交互
  • C语言,静态变量static基础及使用实列
  • 2023.8.19-2023.8.XX 周报【人脸3D+虚拟服装方向基础调研-Cycle Diffusion\Diffusion-GAN\】更新中
  • 微表情识别(Python编程,cnn模型)
  • More Effective C++学习笔记(2)
  • 零售行业供应链管理核心KPI指标(三)
  • 广州华锐互动:奶牛难产原因及救治VR仿真实训系统
  • 神经网络基础-神经网络补充概念-62-池化层
  • 第8章:集成学习
  • 设计HTML5列表和超链接
  • React Native 环境搭建
  • 【uniapp】中 微信小程序实现echarts图表组件的封装
  • AgentBench::AI智能体发展的潜在问题(三)
  • zookeeper-安装部署
  • jvm-运行时数据区概述及线程
  • 石头IT
  • R语言dplyr包select函数删除dataframe数据中包含指定字符串内容的数据列(drop columns in dataframe)
  • [GitOps]微服务版本控制:使用ArgoCD 部署Grafana Loki
  • 什么是单例模式
  • 【Linux从入门到精通】动静态库的原理与制作详解
  • 【mybatis】mapper.xml中foreach的用法,含批量查询、插入、修改、删除方法的使用
  • c#扩展方法的使用
  • rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景
  • 常见指令以及权限理解
  • OpenCV基础知识(6)— 滤波器
  • IOC容器的基础功能设计模式
  • FFmpeg参数说明FFmpegAndroid饺子视频播放器
  • DNS入门学习:DNS解析生效问题(中科三方)