题目描述
本题是leetcode一道简单题:合并两个有序数组,但是对于时间和空间复杂度面试官明确给出了限制。
// 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。 // 初始化 A 和 B 的元素数量分别为 m 和 n。 // // 示例: // 输入: // A = [1,2,3,0,0,0], m = 3 // B = [2,5,6], n = 3 // // 输出: [1,2,2,3,5,6] // // 说明:A.length == n + m // // 最低要求:时间复杂度:O(m+n)、空间复杂度:O(m+n)
思路分析
第一种解法 :合并+快排
思路: 最简单的办法就是将B数组添加到A数组的末尾,再对A数组进行快排 ,但是其时间复杂度和空间复杂度为均不符合要求,所以PASS
第二种解法:双指针
思路:
1)初始化:定义三个指针p1,p2和p分别指向数组A的m-1,B的n-1,和A的m+n-1的下标;
2)遍历过程:使用p1,p2指针遍历数组A和B,将较大的元素放入p下标处,直到将数组B的元素全部放入数组A中;
3)输出结果:最后输出数组A
代码实现
基于以上思路,Golang的代码实现如下:
Go
func MergeSortedArrays(nums1 []int, m int, nums2 []int, n int) {
p1, p2, p := m-1, n-1, m+n-1
//直到nums2遍历完结束
for p2 >= 0 {
//从后向前遍历,取两者较大值
//若p1先遍历完,可能会出现下标越界,所以应判断p1>=0?
if p1 >= 0 && nums1[p1] > nums2[p2] {
nums1[p] = nums1[p1]
p1--
} else {
nums1[p] = nums2[p2]
p2--
}
p--
}
}