Appearance
双指针
这部分在之前的算法中有涉及到,下面是涉及到的题目:
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
}