返回
巧用指针合并有序数组,代码简洁步步搞定!
前端
2023-11-21 10:22:24
在当今竞争激烈的技术领域,掌握编程和算法技能至关重要。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面试题,详细讲解了巧妙运用指针合并有序数组的方法。指针解法具有时间复杂度低、空间复杂度小的优点,是解决这类问题常用的方法。掌握指针的使用技巧,可以让你在面试中更加游刃有余,展现出扎实的编程功底。