华为OD面试手撕算法-合并排序数组

题目描述

本题是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--
	}
}
相关推荐
小O的算法实验室9 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
风止何安啊10 小时前
为什么要有 TypeScript?让 JS 告别 “薛定谔的 Bug”
前端·javascript·面试
郭涤生10 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿10 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz10 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能10 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****10 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能10 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能11 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo11 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法