Skip to content

双指针

这部分在之前的算法中有涉及到,下面是涉及到的题目:

1.合并排序

给定两个已排序(升序)好的数组,将两个数组合并为一个新的数组,并使新数组仍然有序

js
function mergeSort(arr1, arr2) {}

console.log(mergeSort([1, 3, 5], [2, 4, 6, 8])) // [1, 2, 3, 4, 5, 6, 8]

解析:双指针

md
⬇️
1, 3, 5
2, 4, 6
⬆️
result = []
比较两个指针的值,小的放入 result 中,指针后移
js
function mergeSort(arr1, arr2) {
  // arr1的指针
  let p1 = 0
  // arr2的指针
  let p2 = 0
  // 存放最后排序结果的数组
  const result = []

  while (p1 < arr1.length || p2 < arr2.length) {
    if (arr1[p1] < arr2[p2]) {
      // arr1[i] 比 arr2[j] 小
      result.push(arr1[p1])
      p1++
    } else if (arr1[p1] > arr2[p2]) {
      // arr1[i] 比 arr2[j] 大
      result.push(arr2[p2])
      p2++
    } else if (p1 >= arr1.length) {
      // arr1已经走完,将arr2剩余内容放入result中
      result.push(arr2[p2])
      p2++
    } else if (p2 >= arr2.length) {
      // arr2已经走完,将arr1剩余内容放入result中
      result.push(arr1[p1])
      p1++
    }
  }

  return result
}

console.log(mergeSort([1, 3, 5], [2, 4, 6, 8])) // [1, 2, 3, 4, 5, 6, 8]

2. 盛最多水的容器

🔗力扣题目链接https://leetcode.cn/problems/container-with-most-water/description/

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]

输出:49

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2

输入:height = [1,1]

输出:1

md
采用双指针来解,需要找到区域面积最大,不断将左右指针内向移动,依次判断大小即可,
如果左指针的值小于右指针的值,则将左指针向右移动,反之亦然。
js
/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height) {
  let left = 0
  let right = height.length - 1
  let maxArea = 0 // 最大面积
  while (left < right) {
    // (right - left):长  Math.min(height[left], height[right]):高
    const currentArea = (right - left) * Math.min(height[left], height[right])
    maxArea = Math.max(maxArea, currentArea)
    // 左侧短,向内移动
    if (height[left] < height[right]) {
      left++
    } else {
      right--
    }
  }
  return maxArea
}