vlambda博客
学习文章列表

程序员面试金典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, 0 for 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 合并两个有序数组,多种解法