python3
def merge(nums1, m, nums2, n):
# 初始化指针
i = m - 1
j = n - 1
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
# 如果 nums2 中还有剩余元素,将其追加到 nums1 的末尾
while j >= 0:
nums1[k] = nums2[j]
j -= 1
k -= 1
优化方案:
def merge_optimized(nums1, m, nums2, n):
# 初始化指针
i = m - 1
j = n - 1
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
# 如果 nums2 中还有剩余元素,将其追加到 nums1 的末尾(优化版)
while j >= 0:
nums1[k] = nums2[j]
j -= 1
k -= 1
# 将 nums1 中剩余的元素(如果存在)置为 0(优化版)
while i >= 0:
nums1[k] = nums1[i]
i -= 1
k -= 1
while k >= 0:
nums1[k] = 0
k -= 1
在双指针法中,我们通常使用两个指针从数组的开始位置向末尾移动,比较元素并进行合并。然而,在这个优化版本中,我们使用了逆指针的方法,即从数组的末尾开始向前移动指针。
通过使用逆指针,我们可以避免在合并过程中不必要的元素移动。当我们从末尾开始比较两个数组的元素时,较大的元素可以直接放入合并后数组的末尾位置。这样,我们就可以在一次遍历中完成合并,提高了效率。
逆指针的方法在处理有序数组的合并问题时非常有效,因为它利用了数组的有序性质,减少了不必要的操作。这种优化可以在许多类似的算法问题中使用,以提高性能。