[路飞]_leetcode-面试题 10.01-合并排序的数组

简介: leetcode-面试题 10.01-合并排序的数组

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。


初始化 A 和 B 的元素数量分别为 m 和 n。


示例:


输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6],       n = 3
输出: [1,2,2,3,5,6]
复制代码


说明:


  • A.length == n + m


解题思路


因为输入数组 A,B都是有序的数组,所以我们在合并的过程中只要保证将数组 B 中的元素插入合适的位置,就能保证合并后的数组依然是有序的。


这里我们定义两个指针 a,b,分别指向数组 A,B 的最后一个元素。


每次让 a 向前找到第一个小于等于 b 指向元素的位置(如果初始 a 指向元素小于等于 b 指向元素,则无需移动),然后将 a 指针后面的元素统一向后移动一位,在空出的位置插入 b 指向元素。这样就保证了每次插入 B 数组中的元素都在合适的位置,插入后,数组 A 依然有序。


向前移动 b 指针,重复上述过程,直到处理完数组 B 中的所有元素,就完成了将 B 合并入 A 的过程。


动画演示


网络异常,图片无法展示
|


代码实现


var merge = function (A, m, B, n) {
  // 初始化指针 a 指向 A 数组的末尾元素
  let a = m - 1,
    // 初始化指针 b 指向 B 数组的末尾元素
    b = n - 1
  // 从后向前的处理 B 数组中的每一个元素
  while (b >= 0) {
    // 让 a 指向第一个小于等于 b 指向元素的位置
    while (A[a] > B[b]) a--
    // 将 a 指针后面的元素统一向后移动一位
    move(A, a)
    // 将 b 指向元素插入空出的位置
    A[a + 1] = B[b]
    // 向前移动 b 指针处理剩余元素
    b--
  }
  /*
   * 传入数组和指定下标,将下标后面的元素统一向后移动一位
   * @param {number[]} arr
   * @param {number} ind
   * * @return {void}
   */
  function move(arr, ind) {
    // 从后向前将每一个元素向后移动一位,直到指定下标为止
    for (let i = arr.length - 2; i > ind; i--) {
      arr[i + 1] = arr[i]
    }
  }
}
复制代码


至此我们就完成了 leetcode-面试题 10.01-合并排序的数组


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
8月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
360 1
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
204 0
Leetcode第三十三题(搜索旋转排序数组)
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
292 0
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
119 0
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
355 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2321 2
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。

热门文章

最新文章