小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、了解题目
附上原题链接:88. 合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
碎碎念: 这道题官方标为简单,但我感觉有点中等难度了……
二、题解分析
依据以上题意,我们来看下这道题的解题思路。具体如下:
- 定义两个指针
p1和p2,p1用来控制数组nums1的下标,p2用来控制数组nums2的下标; - 定义一个数组
sorted,并将其填充满0; - 填充当前值
cur的四个条件:①p1指针等于m值时;②p2指针等于n值时;③nums1[p1] < nums2[p2]时;④其余情况。
三、代码实现
下面我们将用 js 来实现这道题。具体实现代码如下:
/**
* @param {Array} nums1
* @param {Number} m
* @param {Array} nums2
* @param {Number} n
* @returns
*/
var merge = function(nums1, m, nums2, n) {
// 1.定义两个指针p1和p2,p1控制m的值(即用来控制nums1数组的下标),p2控制n的值(即用来控制nums2数组的下标)
let p1 = 0, p2 = 0;
// 2.将sorted进行初始化数组,并将每个元素都填充上0
const sorted = new Array(m + n).fill(0);
// 3.定义一个cur,表示当前值
let cur;
// 4.判断条件:p1小于m 或者 p2小于n时
while (p1 < m || p2 < n) {
// 4.1 当p1的值等于m时,说明p1已经走到尽头,此时对p2进行+1操作
if (p1 === m) {
cur = nums2[p2++];
}
// 4.2 当p2的值等于n时,说明p2已经走到尽头,此时对p1进行+1操作
else if (p2 === n) {
cur = nums1[p1++];
}
// 4.3 当p1所对应nums1数组的值 小于 p2所对应nums2数组的值时,则当前值等于nums1[p1],并将p1进行+1操作
else if (nums1[p1] < nums2[p2]) {
cur = nums1[p1++];
}
// 其余的情况则,当前值等于nums[p2],并将p2进行+1操作
else {
cur = nums2[p2++];
}
// 5.一一放进sorted数组中
sorted[p1 + p2 - 1] = cur;
}
// 6.将nums1后面的内容覆盖掉
for (let i = 0; i != m + n; i++) {
nums1[i] = sorted[i];
}
// 7.返回最终的数组
return sorted;
};
console.log(merge([1,2,3,0,0,0], 3, [2,5,6], 3));
以上就是关于合并两个有序数组的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋