返回

LeetCode:合并两个有序数组的艺术

前端

好的,以下是关于「LeetCode 探索(18):88-合并两个有序数组」的文章。




大家好,欢迎来到 LeetCode 探索之旅的第十八篇。今天,我们将一起探索如何合并两个有序数组,使合并后的数组仍然有序。

问题

给你两个按非递减顺序排列的整数数组 nums1nums2,另有两个整数 mn,分别表示 nums1nums2 中的元素数目。请你合并 nums2nums1 中,使合并后的数组同样按非递减顺序排列。

解决方案

我们可以使用双指针法来解决这个问题。首先,我们定义两个指针 ij,分别指向 nums1nums2 的第一个元素。然后,我们比较这两个指针指向的元素,并将较小的元素放入合并后的数组中。同时,将较小元素的指针后移。重复这个过程,直到 nums1nums2 中的一个数组遍历完毕。

当一个数组遍历完毕后,我们将另一个数组中剩下的元素直接复制到合并后的数组中。

以下是详细的实现步骤:

  1. 定义两个指针 ij,分别指向 nums1nums2 的第一个元素。
  2. 创建一个新数组 merged,用于存储合并后的数组。
  3. 比较 nums1[i]nums2[j],并将较小的元素放入 merged 中。
  4. 将较小元素的指针后移。
  5. 重复步骤 3 和 4,直到 nums1nums2 中的一个数组遍历完毕。
  6. 将另一个数组中剩下的元素直接复制到 merged 中。
  7. 返回 merged

代码示例

def merge(nums1, m, nums2, n):
    """
    :type nums1: List[int]
    :type m: int
    :type nums2: List[int]
    :type n: int
    :rtype: None Do not return anything, modify nums1 in-place instead.
    """
    # 定义两个指针
    i = 0
    j = 0

    # 创建一个新数组
    merged = []

    # 合并两个数组
    while i < m and j < n:
        if nums1[i] < nums2[j]:
            merged.append(nums1[i])
            i += 1
        else:
            merged.append(nums2[j])
            j += 1

    # 将剩下的元素复制到新数组
    while i < m:
        merged.append(nums1[i])
        i += 1
    while j < n:
        merged.append(nums2[j])
        j += 1

    # 将新数组复制到 nums1
    for i in range(len(merged)):
        nums1[i] = merged[i]

# 测试代码
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
merge(nums1, m, nums2, n)
print(nums1)

总结

以上就是合并两个有序数组的算法。这种算法的时间复杂度为 O(m + n),其中 mn 是两个数组的长度。

希望这篇文章对您有所帮助。如果您有任何问题,欢迎在评论区留言。