LeetCode热题100JS(6/100)第一天|128. 最长连续序列|283. 移动零|11. 盛最多水的容器|15. 三数之和

embedded/2025/3/3 5:17:33/

 之前做过两道题,所以从第三题开始记录


128. 最长连续序列

题目链接:128. 最长连续序列

难度:中等

刷题状态:1刷

新知识:

解题过程

思考

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

不难,但重点是要O(n)

题解分析

参考题解链接:哈希表 O(n) 做法(Python/Java/C++/C/Go/JS/Rust)

详细分析如下

javascript">/*** @param {number[]} n ums* @return {number}*/
var longestConsecutive = function(nums) {let set=new Set(nums)let res=0for(let s of set){if(set.has(s-1)){continue//跳过本次循环,确保下面的s是从某个连续数组开始的//也就是确保下面的s是某连续数组的起点}let y=s+1//s是连续数组的起点,所以后面要减掉//这里是核心代码while(set.has(y)){y++}res=Math.max(res,y-s)}return res
};

手搓答案(无非废话版)

javascript">var longestConsecutive = function(nums) {let res=0let set=new Set(nums)for(let s of set){if(set.has(s-1)) continuelet y=s+1while(set.has(y)){y++}res=Math.max(res,y-s)}return res
}

总结

重点是要理解什么情况下开始y++的循环

283. 移动零

题目链接:283. 移动零

难度:简单

刷题状态:1刷

新知识:

解题过程

思考

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

不复制的意思就是插入,直接修改数组,还要用双指针法

我自己倒是手搓出来了,但是速度太慢了O(N2)

题解分析

参考题解链接:移动零

答案这里用的快慢指针,slow标记非0数的结尾,fast遍历数组

大概逻辑是,fast往前跑,碰到非零数就往slow的位置一扔,slow++为填入下一个非0数做准备

这样只用遍历一遍O(N)

javascript">/*** @param {number[]} nums* @return {void} Do not return anything, modify nums in-place instead.*/
var moveZeroes = function(nums) {let slow=0,fast=0//slow是while(fast<nums.length){if(nums[fast]!=0){//0 交换nums[slow]   nums[fast]let n=nums[slow]nums[slow]=nums[fast]nums[fast]=nslow++}fast++}return nums
};

手搓答案(无非废话版)

javascript">var moveZeroes = function(nums) {let slow=0,fast=0while(fast<nums.length){if(nums[fast]){let tmp=nums[slow]nums[slow]=nums[fast]nums[fast]=tmpslow++}fast++}return nums
}

总结

 双指针不是left right 就是slow fast

11. 盛最多水的容器

题目链接:11. 盛最多水的容器

难度:中等

刷题状态:2刷

新知识:

解题过程

思考

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

直接拿下~

题解分析

参考题解链接:盛最多水的容器

手搓答案(无非废话版)

javascript">/*** @param {number[]} height* @return {number}*/var maxArea = function(height) {let left=0,right=height.length-1let res=0while(left<right){let v=Math.min(height[left],height[right])*(right-left)res=Math.max(res,v)if(height[left]<height[right]){left++}else{right--}}return res
}

总结

 在灵神题库刷过啦~

15. 三数之和

题目链接:​​​​​​​15. 三数之和

难度:中等

刷题状态:2刷

新知识:

解题过程

思考

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

也是2刷啦~

三数之和为0,双指针做法

好吧,忘记套路了,自己也没有试出来5555

题解分析

参考题解链接:​​​​​​​三数之和

1刷的过程放下

javascript">var threeSum = function(nums) {
// nums = [-1,0,1,2,-1,-4]let a=["T15-出罐交点-1", "250-CO-101/T15"]let b=a[0]+a[1]console.log('b',typeof b)//先排序
nums.sort((a,b)=>a-b)
//[-4,-1,-1,0,1,2]
let res=[]
let n=nums.length
for(let i=0;i<n;i++){if(nums[i]>0){break//如果第一个大于0,后面的都没意义} let left=i+1//第一个后面的第一个let right=n-1//第一个后面的最后一个if(i>0&&nums[i]==nums[i-1]){continue//如果当前不是第一个而且和前一个是一样的,跳过当前循环,避免x重复} // console.log(x)成功跳过重复xwhile(left<right){let sum=nums[i]+nums[left]+nums[right]if(sum==0){res.push([nums[i],nums[left],nums[right]])//接下来去掉重复ywhile(left<right&&nums[left]==nums[left+1]){left++}while(left<right&&nums[right]==nums[right-1]){right--}}sum>0?right--:left++}}
return res
};

看了解答之后思路还是很清晰的,但是有个地方需要注意

javascript">if(sum==0){res.push([nums[i],nums[left],nums[right]])while(left<right&&nums[left+1]==nums[left]){left++}while(left<right&&nums[right-1]==nums[right]){right--}}
//这里一定是要分开写的,不能else if(sum<0)
//因为上面内部left,right有调整,出来之后的sum相当于重新计算过了
//等同于这里也有
//sum=nums[i]+nums[left]+nums[right]if(sum<0){left++}else{right--}

手搓答案(无非废话版)

javascript">var threeSum = function(nums) {nums.sort((a,b)=>a-b)let res=[],n=nums.lengthif(nums[0]>0||nums[n-1]<0) return resfor(let i=0;i<n;i++){let left=i+1,right=n-1if(i>0&&nums[i]==nums[i-1]) continuewhile(left<right){let sum=nums[i]+nums[left]+nums[right]if(sum==0){res.push([nums[i],nums[left],nums[right]])while(left<right&&nums[left+1]==nums[left]){left++}while(left<right&&nums[right-1]==nums[right]){right--}}sum<0?left++:right--}}return res
}

总结

 else if 那里还真是个坑,,多刷多练吧,查漏补缺


http://www.ppmy.cn/embedded/169231.html

相关文章

标签使用笔记

文章目录 文件夹结构可以有多个功能吗?标签是如何保存的 标签做成对外接口保存、修改查询删除标签列表标签表设计标签和分类的区别 虽然大体知道怎么设计做&#xff0c;但是整理出来更清晰&#xff0c;那么整理下。 一般来说有两种索引就够。 1、标题文字索引。 # 用于搜索文章…

(python)Arrow库使时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…

python量化交易——金融数据管理最佳实践——qteasy创建本地数据源

文章目录 qteasy金融历史数据管理总体介绍本地数据源——DataSource对象默认数据源查看数据表查看数据源的整体信息最重要的数据表其他的数据表 从数据表中获取数据向数据表中添加数据删除数据表 —— 请尽量小心&#xff0c;删除后无法恢复&#xff01;&#xff01;总结 qteas…

Java进阶(ElasticSearch的安装与使用)

目录 1.ElasticSearch环境搭建 elasticSearch&#xff0c;elastic Search head &#xff0c;kibana ?二&#xff0e;使用ES 2.1 ?Ik分词器 ?2.2 restful与索引操作 2.3 文档操作 三&#xff0e;集成springboot 1.ElasticSearch环境搭建 elasticSearch&#xff0c;el…

鸿蒙新版开发工具DevEco Studio不能新建模拟的解决方法

鸿蒙新版开发工具DevEco Studio不能新建模拟的解决方法 许多想要了解鸿蒙开发的同学不一定都有华为的手机&#xff0c;那么模拟器就是最好的替代方案了。 但是下载最新的DevEco Studio之后&#xff0c;在Intel芯片的Mac电脑上&#xff0c;会发现无法新建模拟器&#xff0c;顿…

RabbitMQ 高级配置与优化:从入门到精通

RabbitMQ 高级配置与优化:从入门到精通 引言 在分布式架构中,消息队列(MQ)是必不可少的一环,而 RabbitMQ 作为业界广泛使用的消息中间件,凭借其高吞吐、可扩展、可靠性等特性备受青睐。然而,很多开发者和运维人员在使用 RabbitMQ 时,仅仅停留在"能用"的层面…

全新开源 OCR 模型:精准识别复杂内容,迈向 2.0 时代!

在如今信息爆炸的时代&#xff0c;如何高效处理大量扫描文档成了每个大家日常生活工作中必备技能。 最近&#xff0c;一款端到端的开源 OCR 模型GOT-OCR2.0&#xff0c;号称将跨向 OCR 2.0 时代&#xff01; 从正式发布官方 Demo 开始&#xff0c;凭借其出色的识别效果&#…

爬虫第九篇-结束爬虫循环

最近在学习Python爬虫的过程中&#xff0c;遇到了一个很有趣的问题&#xff1a;如何优雅地结束爬虫循环&#xff1f;今天&#xff0c;我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时&#xff0c;我们经常会遇到这样的情况&#xff1a;当爬取到的…