LeetCode 挑战:合并排序数组 - JavaScript 解决方案
顶级访谈150
合并排序数组是一个经典问题,了解如何有效解决它对于编码面试至关重要。在这篇文章中,我们将使用 JavaScript 来解决 LeetCode 的 88. 合并排序数组,这是顶级面试 150 个问题挑战的一部分。让我们深入研究这个问题、它的细微差别以及一个干净、最佳的解决方案!
?问题描述
给定两个整数数组 nums1 和 nums2,按非降序排序。您的任务是将 nums2 合并到 nums1 中,使 nums1 保持排序状态。
但是,有一个转折点:
nums1 有足够的空间(设置为 0s)来容纳 nums2 的元素。
最终的合并结果必须就地存储在 nums1 中。
?示例
示例1
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 Output: [1,2,2,3,5,6]
示例2
Input: nums1 = [1], m = 1, nums2 = [], n = 0 Output: [1]
示例3
Input: nums1 = [0], m = 0, nums2 = [1], n = 1 Output: [1]
?主要见解
- 就地合并:需要填充nums1而不使用额外的空间。这意味着直接修改数组。
- 从后到前的策略:由于nums1末尾有多余的空间,最有效的方法是从后面填充。
? JavaScript 解决方案:两指针方法
最佳解决方案利用双指针方法,从两个数组的末尾开始。这确保了最大的元素首先放置,避免不必要的元素移动。
var merge = function(nums1, m, nums2, n) { // Initialize pointers for nums1, nums2, and the last index of nums1 let p1 = m - 1; let p2 = n - 1; let p = m + n - 1; // Compare elements from the end and place the largest at the back while (p1 >= 0 && p2 >= 0) { if (nums1[p1] > nums2[p2]) { nums1[p] = nums1[p1]; p1--; } else { nums1[p] = nums2[p2]; p2--; } p--; } // Copy remaining elements from nums2 (if any) while (p2 >= 0) { nums1[p] = nums2[p2]; p2--; p--; } };
?工作原理
从末尾开始:
比较 nums1 和 nums2 的最大元素(使用 p1
和 p2 指针)。将较大的元素放在
的末尾 nums1(使用 p 指针)。递减指针:
在处理元素时移动 p1、p2 和 p。处理剩余元素:
如果 nums2 中还有剩余元素,则将其复制到 nums1 中。 (没有
需要从 nums1 复制元素,因为它们已经就位。)
?复杂度分析
?试运行
输入:
nums1 = [1,2,3,0,0,0],m = 3,nums2 = [2,5,6],n = 3
步骤 p1 p2 p nums1
初始化 2 2 5 [1,2,3,0,0,0]
1 2 2 5 [1,2,3,0,0,6]
2 2 1 4 [1,2,3,0,5,6]
3 2 0 3 [1,2,3,3,5,6]
4 1 0 2 [1,2,2,3,5,6]
5 0 0 1 [1,2,2,3,5,6]
最终输出:[1,2,2,3,5,6]
?自己尝试一下吧!
查看 LeetCode 上的完整问题和测试用例。挑战自己,在不看代码的情况下实现解决方案!
✨ 面试专业技巧
- 澄清限制:询问您是否可以使用额外的空间,或者如果- 地点为必填项。
- 针对边缘情况进行优化:考虑 nums2 为空的情况 或者 nums1 没有初始元素 (m = 0)。
- 演练你的逻辑:解释两指针方法 向面试官说清楚。
有任何问题或见解吗?在下面的评论中分享吧!我们一起来学习吧。 ?
以上是LeetCode 挑战:合并排序数组 - JavaScript 解决方案的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在Node.js中发起HTTP请求有三种常用方式:使用内置模块、axios和node-fetch。1.使用内置的http/https模块无需依赖,适合基础场景,但需手动处理数据拼接和错误监听,例如用https.get()获取数据或通过.write()发送POST请求;2.axios是基于Promise的第三方库,语法简洁且功能强大,支持async/await、自动JSON转换、拦截器等,推荐用于简化异步请求操作;3.node-fetch提供类似浏览器fetch的风格,基于Promise且语法简单

JavaScript的数据类型分为原始类型和引用类型。原始类型包括string、number、boolean、null、undefined和symbol,其值不可变且赋值时复制副本,因此互不影响;引用类型如对象、数组和函数存储的是内存地址,指向同一对象的变量会相互影响。判断类型可用typeof和instanceof,但需注意typeofnull的历史问题。理解这两类差异有助于编写更稳定可靠的代码。

JavaScript中filter()方法用于创建一个包含所有通过测试元素的新数组。1.filter()不修改原数组,而是返回符合条件元素的新数组;2.基本语法为array.filter((element)=>{returncondition;});3.可按属性值过滤对象数组,如筛选年龄大于30的用户;4.支持多条件筛选,例如同时满足年龄和名字长度条件;5.可处理动态条件,将筛选参数传入函数以实现灵活过滤;6.使用时注意必须返回布尔值,避免返回空数组,以及结合其他方法实现字符串匹配等复杂逻

在JavaScript中检查数组是否包含某个值,最常用方法是includes(),它返回布尔值,语法为array.includes(valueToFind),例如fruits.includes('banana')返回true;若需兼容旧环境,则使用indexOf(),如numbers.indexOf(20)!==-1返回true;对于对象或复杂数据,应使用some()方法进行深度比较,如users.some(user=>user.id===1)返回true。

处理异步函数中的错误应使用try/catch、在调用链中处理、使用.catch()方法、并监听unhandledrejection事件。1.使用try/catch捕获错误是推荐方式,结构清晰且能处理await中的异常;2.在调用链中处理错误可集中逻辑,适合多步骤流程;3.使用.catch()可在调用async函数后捕获错误,适用于Promise组合场景;4.监听unhandledrejection事件可记录未处理的rejection,作为最后一道防线;以上方法共同确保异步错误被正确捕获和处理。

虚拟DOM是一种优化真实DOM更新的编程概念,通过在内存中创建与真实DOM对应的树形结构,避免频繁直接操作真实DOM。其核心原理是:1.数据变化时生成新的虚拟DOM;2.对比新旧虚拟DOM找出最小差异;3.批量更新真实DOM以减少重排重绘开销。此外,使用唯一稳定key可提升列表对比效率,而部分现代框架已采用其他技术替代虚拟DOM。

JavaScript的作用域决定变量可访问范围,分为全局、函数和块级作用域;上下文决定this的指向,依赖函数调用方式。1.作用域包括全局作用域(任何地方可访问)、函数作用域(仅函数内有效)、块级作用域(let和const在{}内有效)。2.执行上下文包含变量对象、作用域链和this的值,this在普通函数指向全局或undefined,在方法调用指向调用对象,在构造函数指向新对象,也可用call/apply/bind显式指定。3.闭包是指函数访问并记住外部作用域变量,常用于封装和缓存,但可能引发

使用addEventListener添加事件监听器需注意:1.使用普通函数确保this指向元素;2.解绑时需用同一函数引用。JavaScript中通过element.addEventListener(eventType,handlerFunction,options)为元素绑定事件,支持多处理函数且不覆盖,如用btn.addEventListener('click',function(){});普通函数中的this指向元素本身,而箭头函数继承外层作用域,因此涉及this时应选用普通函数;若需移除
