返回
用JavaScript征服LeetCode 88:合并两个有序数组
前端
2024-02-12 00:04:24
各位程序员伙伴,准备好迎接LeetCode 88的挑战了吗?今天,我们将踏上合并两个有序数组的征途,用JavaScript的优雅魅力来解决这个难题。
问题解剖
在LeetCode 88中,你将面对两个有序数组nums1和nums2,以及两个整数m和n,分别代表nums1和nums2的长度。你的任务是将这两个数组合并成一个新的有序数组。
兵法八阵
为了征服LeetCode 88,我们需要制定周密的作战计划。这里有三种常用的策略:
逐个合并法
这种方法从头开始,一次比较两个数组中的元素,将较小的元素放入合并后的数组中,直到一个数组中的元素全部加入合并后的数组。
双指针法
此策略使用两个指针来遍历nums1和nums2。指针每次指向两个数组中最小的元素,将较小的元素放入合并后的数组中,然后将相应的指针移动到下一个元素。
递归法
将合并过程分成较小的部分。将nums1和nums2分成两半,然后递归合并每个半部分,最后将合并后的半部分合并。
代码实现
现在,让我们用JavaScript来实现这些策略:
// 逐个合并法
function merge1(nums1, m, nums2, n) {
const merged = [];
let i = 0, j = 0;
while (i < m && j < n) {
if (nums1[i] <= nums2[j]) {
merged.push(nums1[i]);
i++;
} else {
merged.push(nums2[j]);
j++;
}
}
while (i < m) {
merged.push(nums1[i]);
i++;
}
while (j < n) {
merged.push(nums2[j]);
j++;
}
return merged;
}
// 双指针法
function merge2(nums1, m, nums2, n) {
let i = 0, j = 0, k = 0;
const merged = new Array(m + n);
while (i < m && j < n) {
if (nums1[i] <= nums2[j]) {
merged[k] = nums1[i];
i++;
} else {
merged[k] = nums2[j];
j++;
}
k++;
}
while (i < m) {
merged[k] = nums1[i];
i++;
k++;
}
while (j < n) {
merged[k] = nums2[j];
j++;
k++;
}
return merged;
}
// 递归法
function merge3(nums1, m, nums2, n) {
if (m === 0) return nums2;
if (n === 0) return nums1;
if (nums1[m - 1] <= nums2[n - 1]) {
nums1[m + n - 1] = nums2[n - 1];
return merge3(nums1, m, nums2, n - 1);
} else {
nums1[m + n - 1] = nums1[m - 1];
return merge3(nums1, m - 1, nums2, n);
}
}
实战演练
假设我们有以下两个有序数组:
nums1 = [1, 2, 3, 0, 0, 0]
nums2 = [2, 5, 6]
m = 3
n = 3
应用我们的策略,我们可以得到以下合并后的数组:
[1, 2, 2, 3, 5, 6]
总结
征服LeetCode 88,掌握合并有序数组的技巧,是JavaScript程序员必备的一项利器。通过逐个合并法、双指针法和递归法的灵活运用,你可以轻松解决此类问题。
记得练习和探索,不断提升你的JavaScript技能。愿你一路披荆斩棘,在代码的世界里所向披靡!