返回

从迭代到双指针:LeetCode 轻松解题,领略合并有序数组的奥秘

前端

合并有序数组:三种有效方法

概述

在软件开发中,经常需要处理有序数组。合并两个有序数组是一个常见的问题,它要求将两个已排序的数组合并成一个单一的、仍然有序的数组。本文将探讨三种有效的方法来解决此问题:迭代法、sort 法和逆向双指针法。

迭代法:逐个元素比较

迭代法是最直接和最容易理解的方法。它涉及从两个数组中取出元素并比较它们。较小的元素被放置在合并后的数组中,指针更新指向下一个元素。该过程一直持续到两个数组都用尽。

代码示例:

def merge(nums1, m, nums2, n):
    i = 0  # nums1 指针
    j = 0  # nums2 指针
    k = 0  # 合并数组指针

    while i < m and j < n:
        if nums1[i] < nums2[j]:
            nums1[k] = nums1[i]
            i += 1
        else:
            nums1[k] = nums2[j]
            j += 1
        k += 1

    while i < m:
        nums1[k] = nums1[i]
        i += 1
        k += 1

    while j < n:
        nums1[k] = nums2[j]
        j += 1
        k += 1

    return nums1

sort 法:合并并排序

sort 法提供了一个更简洁的解决方案。它涉及将两个数组合并成一个数组,然后使用内置的 sort 函数对合并后的数组进行排序。排序后的数组是合并后的有序数组。

代码示例:

def merge(nums1, m, nums2, n):
    nums1[m:] = nums2  # 将 nums2 合并到 nums1
    nums1.sort()  # 对合并后的数组进行排序
    return nums1

逆向双指针法:从后往前比较

逆向双指针法利用两个数组的尾部作为指针。它从这两个数组的最后一个元素开始,然后将较大的元素插入合并后的数组中并更新指针。这个过程一直持续到两个指针都指向数组的开头。

代码示例:

def merge(nums1, m, nums2, n):
    i = m - 1  # nums1 指针
    j = n - 1  # nums2 指针
    k = m + n - 1  # 合并数组指针

    while i >= 0 and j >= 0:
        if nums1[i] > nums2[j]:
            nums1[k] = nums1[i]
            i -= 1
        else:
            nums1[k] = nums2[j]
            j -= 1
        k -= 1

    while i >= 0:
        nums1[k] = nums1[i]
        i -= 1
        k -= 1

    while j >= 0:
        nums1[k] = nums2[j]
        j -= 1
        k -= 1

    return nums1

选择最佳方法

这三种方法都有其优点和缺点。迭代法最容易理解,sort 法最简洁,逆向双指针法速度最快。在选择方法时,请考虑数组的大小、可用内存和所需的性能。

结论

合并有序数组是一个常见的问题,可以通过多种方法解决。本文介绍了三种有效的方法,每种方法都有其独特优点。通过理解这些方法的差异,您可以根据特定需求做出最佳选择。

常见问题解答

  • 哪种方法最适合大数组?

    • 逆向双指针法通常最适合大数组。
  • 哪种方法最节省内存?

    • sort 法最节省内存。
  • 哪种方法最简单?

    • 迭代法是最简单的。
  • 哪种方法速度最快?

    • 逆向双指针法速度最快。
  • 什么时候可以使用迭代法?

    • 迭代法适用于需要逐步控制合并过程的情况。