程序员面试金典10.01_go_合并排序的数组

Posted 每天都AC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试金典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 合并两个有序数组,多种解法






以上是关于程序员面试金典10.01_go_合并排序的数组的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试金典01.01_go_判定字符是否唯一

#yyds干货盘点# LeetCode程序员面试金典:搜索旋转数组

程序员面试金典面试题 03.05. 栈排序

边做算法边学go语言之程序员面试金典面试题 01.06. 字符串压缩

程序员面试金典-面试题 10.09. 排序矩阵查找

程序员面试金典-面试题 17.04. 消失的数字