【hot100】跟着小王一起刷leetcode -- 128,2024新一波程序员跳槽季

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

题目解读

128. 最长连续序列
在这里插入图片描述
ok,兄弟们,咱们看这个题哈,还是哈希分类下,然后一看题目,居然是中等题,做了一道简单题的我觉得我又可以了,接下来咱们一起看看这个中等题。
在这里插入图片描述
然后读完题之后发现不对了,这。。。。。题目怎么都看不懂呀

看似非常简短的题目,实则好难
在这里插入图片描述
害,那咱也得做呀,一点点看吧

先看下关键的要求哈,只要求时间复杂度是o(n),这是啥意思,这不明摆告诉咱,空间你使劲用,可别不好意思,而且还是哈希分类下,咱想想能不能用hash的方式解决。

首先哈,咱先了解一个事,n,2n,3n都是O(n),也就是n前面那个数只要是固定的,都是O(n)。

了解这个之后咱想一下,这个问题怎么能用空间来换取时间呢?

看题目,咱们知道,就是在找到原数组中能组成最长连续数字序列的长度,啥意思呢?

例如数组是[0,2,3,1,7,4,9],这时候组成的连续的序列有哪些呢?

是不是就是[0,1,2,3,4],也就说原数组中每个数的位置不重要,只要这些数可以组成一个连续的序列即可,然后返回最长序列的长度即可。

关键问题

那我们想一下,怎么入手呢?

首先哈,我们想要达到的效果是O(n),那怎么才能达到O(n)呢?

最好的情况,就是我们一次遍历就能拿到结果,这就是最佳的时间复杂度,但看起来有点困难,那我们把这个时间放宽点,2n,3n或则有限n能不能做到?

这就意味着,我们可以花费n的时间去做一些准备工作,然后再进行处理。

那我们要做什么准备工作呢?

我们从最简单的思想入手,假如这个序列是有序的,那做起来是不是就是很简单,也就是说只需要遍历,一旦出现不连续的部分就代表一个序列的结束,过程中保留最长序列长度即可,但是现在的问题就是该序列并不是有序的。最简单的一个方法就是先排序,然后在进行上述操作就可以,但时间复杂度可能就不大合适了。

然后我试了试排序,没想到,排序更快
在这里插入图片描述

在这里插入图片描述
但本着尝试新办法的心态,咱们还是考虑考虑,怎么可以再不排序的情况下进行类似的操作。

排序之后要做的工作其实就是一点点遍历,然后看看这些数是不是连续的,那不排序能不能也知道该数之后是否还是连续的呢?

答案是可以!

我们首先讲序列中的数字存到map中,key为数字本身的值,value统一设置为1。

这么做的好处是什么呢?

这样我们在遍历原序列的时候可以直接找到该数字之后是否还连续**,例如我现在遍历的是3,我只需要查看4是否在map中,这样就类似于排序之后的效果。遍历完4之后再看看5存在不,依次这样下去,就能知道3起头的序列长度最长有多少了。**

这里有一个小tips,我们在遍历3的时候,已经把3,4,5这一条路走过了,也就是说这时候遍历4的时候并不需要再进行遍历了,因为3的时候已经求出了相对于4起头的序列更长的序列了,此时4,5就没必要在遍历了。就给我们剩下了时间,就直接把map中key为4,5的删除,即可,这样遍历原序列的时候就不需要遍历这俩了。注意遍历3开头的序列结束之后,需要将序列长度存到key为3的value中。

这时候聪明的小伙伴就会说,那如果2是在3之后怎么处理呢?

这也很简单,我们只需要判断3是否存在,并且将其3代表的序列长度直接加到2的value上即可。

重复上述工作,直到完成了原序列的遍历,结果就出来了。

但最后发现时间复杂度干不过排序,就很尴尬,大家有时间的话帮我瞅一眼时间复杂度是多少
在这里插入图片描述

代码

class Solution {
    public int longestConsecutive(int[] nums) {
        int maxlength = 0;
        HashMap<Integer, Integer> integerIntegerHashMap = new HashMap<>();
        // 将原序列的值存储到map中,方便后续遍历时判断后面是否存在连续的值
        for (int num : nums) {
            if (!integerIntegerHashMap.containsKey(num))
                integerIntegerHashMap.put(num, 1);
        }


### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/a3e2217b51d25b6146c9fe6b43355951.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/3c65b73d5379f2deb7bfc095062b3ff5.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
![img](https://img-blog.csdnimg.cn/img_convert/8809cca7277a5a4c94963f165a8808b1.jpeg)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
 (备注运维)**
[外链图片转存中...(img-kajJ5ukf-1713195952734)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值