返回

用JavaScript征服LeetCode 88:合并两个有序数组

前端

各位程序员伙伴,准备好迎接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技能。愿你一路披荆斩棘,在代码的世界里所向披靡!