程序员面试金典10.01_go_合并排序的数组
程序员面试金典10.01_合并排序的数组
01
—
题目
给定两个排序后的数组 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
02
—
解题思路分析
1、合并后排序;时间复杂度O(nlog(n)),空间复杂度O(1)
func merge(A []int, m int, B []int, n int) {A = A[:m]A = append(A, B[:n]...)sort.Ints(A)}
2、双指针法;时间复杂度O(n),空间复杂度O(1)
func merge(A []int, m int, B []int, n int) {for m > 0 && n > 0 {if A[m-1] < B[n-1] {A[m+n-1] = B[n-1]n--} else {A[m+n-1] = A[m-1]m--}}if m == 0 && n > 0 {for n > 0 {A[n-1] = B[n-1]n--}}}
3、数组辅助;时间复杂度O(n),空间复杂度O(n)
func merge(A []int, m int, B []int, n int) {temp := make([]int, m)copy(temp, A)if n == 0 {return}first, second := 0, 0for i := 0; i < len(A); i++ {if second >= n {A[i] = temp[first]first++continue}if first >= m {A[i] = B[second]second++continue}if temp[first] < B[second] {A[i] = temp[first]first++} else {A[i] = B[second]second++}}}
03
—
总结
Easy题目,同leetcode88 合并两个有序数组,多种解法
