小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、了解题目
附上原题链接: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));
以上就是关于合并两个有序数组的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋