返回

巧用指针合并有序数组,代码简洁步步搞定!

前端

在当今竞争激烈的技术领域,掌握编程和算法技能至关重要。LeetCode作为程序员必备的刷题网站,其中一道经典面试题是“合并两个有序数组”。这道题看似简单,却蕴含着不少技巧。本篇文章将从一道LeetCode面试题开始,手把手教你巧妙运用指针合并有序数组,让你在面试中脱颖而出!

题目

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

示例:

输入:A = [1, 2, 3, 0, 0, 0], m = 3
B = [2, 5, 6],       n = 3

输出:[1, 2, 2, 3, 5, 6]

指针解法

为了巧妙地合并两个有序数组,我们引入“指针”的概念。指针是一种变量,它可以指向内存中的某个位置。我们使用两个指针分别指向两个数组的末尾元素,然后从后往前比较两个元素的大小,将较大的元素放到A数组中,并更新指针的位置。重复这个过程,直到其中一个数组为空,即可完成合并。

def merge(A, m, B, n):
    """
    :type A: List[int]
    :type m: int
    :type B: List[int]
    :type n: int
    :rtype: None Do not return anything, modify A in-place instead.
    """
    # 指针指向A和B数组的末尾元素
    i = m - 1
    j = n - 1
    k = m + n - 1

    # 从后往前比较两个元素的大小
    while i >= 0 and j >= 0:
        if A[i] > B[j]:
            A[k] = A[i]
            i -= 1
        else:
            A[k] = B[j]
            j -= 1
        k -= 1

    # 将剩余的元素复制到A数组中
    while i >= 0:
        A[k] = A[i]
        i -= 1
        k -= 1

    while j >= 0:
        A[k] = B[j]
        j -= 1
        k -= 1

算法分析

指针解法的时间复杂度为O(m+n),其中m和n分别为A和B数组的长度。空间复杂度为O(1),因为我们没有创建新的数组,只是修改了原有的A数组。

总结

本篇文章通过一道LeetCode面试题,详细讲解了巧妙运用指针合并有序数组的方法。指针解法具有时间复杂度低、空间复杂度小的优点,是解决这类问题常用的方法。掌握指针的使用技巧,可以让你在面试中更加游刃有余,展现出扎实的编程功底。