博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Longest Consecutive Sequence
阅读量:2375 次
发布时间:2019-05-10

本文共 1725 字,大约阅读时间需要 5 分钟。

public int longestConsecutive(int[] num) {        int res = 0;        HashSet
set = new HashSet
(); for(int i = 0; i < num.length; i++) set.add(num[i]); for(int i = 0; i < num.length; i++){ if(set.contains(num[i])){ int head = num[i], tail = num[i]; int cur_len = 1; set.remove(head); while(set.contains(head - 1) || set.contains(tail + 1)){ if(set.contains(head - 1)){ head--; set.remove(head); cur_len++; } if(set.contains(tail + 1)){ ++tail; set.remove(tail); cur_len++; } } res = Math.max(res, cur_len); } } return res; }
https://oj.leetcode.com/problems/longest-consecutive-sequence/

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,

Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

public int longestConsecutive(int[] num)

之前这一题tag里面是有一条HashSet的,但后来没了,估计是作者觉得给了这个提示答案就太明显了。

那我们就跟据这个提示走,实际上知道要用HashSet之后,就不难了。可以认为这是一个HashSet比较特殊的用法,我想这属于一种利用HashSet进行伪排序。中心思想是这样的:假如这个input不是数组,是HashSet,该怎么做? 那么我们在遍历这个HashSet的时候,当我们遍历到100,那么我们就尝试同时往左右两边试探,看看99和101在不在。当然,在示例里都不存在,所以我们往下走,走到4,继续左右试探,然后发现3在,再试探,发现2和1都在。于是乎我们有了一个长度为4的临时答案。别忘了,当我们每扫到一个元素(包括正常遍历和左右试探)我们都要在HashSet里面删掉它以免重复遍历的情况出现。继续回到刚才的解题过程,当我们最后扫到200的时候,发现其左右也不存在,到这个时候扫描已经完毕了。所以这一题的答案就是我们刚才扫到的最大的值4.

下面就给出代码吧:

转载地址:http://ogaxb.baihongyu.com/

你可能感兴趣的文章
如何在vue-cli中配置amazeui的vue版本
查看>>
vue-router路由切换 组件重用挖下的坑
查看>>
如何用vue 语法 给html元素绑定原生js DOM 事件
查看>>
vue非父子组件通信问题解决记录
查看>>
axios异步请求如何设置通过django的csrf验证
查看>>
js单线程执行引起的setTimeout和ajax执行的迷之bug
查看>>
自己动手实现简易的div可编辑富文本框及按下tab键后增加4个空格功能
查看>>
浅谈自己知道的首屏加载时间的优化策略
查看>>
java 集合类如何正确在迭代中添加删除元素
查看>>
如何在django中使用mysql数据库
查看>>
《matlab揭秘》解方程笔记
查看>>
《matlab揭秘》求极限,导数,微分方程,积分笔记
查看>>
matlab基础操作查漏补缺
查看>>
自定义BP神经网络参数
查看>>
灵活的string类与istringstream的联合使用
查看>>
高斯信道下信号相位估计
查看>>
C++中可变参函数的几种实现方法
查看>>
C++中使用vector动态创建多维数组
查看>>
进程join和detach注意事项
查看>>
C++原子操作atomic库介绍
查看>>