🧠 解决具有单调性(Monotonicity)或需要两端向中间收缩的问题。

一句话结论:
👉 数组有序(前提) 结构由两端点决定 可利用左右的元素的对称关系 可以排除出界元素
在 while 循环内部如果还有指针移动(如跳过空格),必须再次判断 left < right,否则会发生索引越界

⭐ 模板

  1. 初始化

    left = 0 (数组的头部)
    right = n - 1 (数组的尾部)
    [可选]res = (记录结果,如最大面积、是否回文等)

  2. 循环处理(控制指针移动)

    while (条件[Q2]) {
    if (条件[Q1]) {
    left++;
    }
    else {
    right–;
    }
    }

  3. 返回结果
    return

Questions:

  1. 左右指针分别代表什么?(物理意义)

在数组/字符串中:它们通常代表“当前正在处理的区间的左右边界下标”。

在某些特定问题中:它们可能代表“可选答案的最小值和最大值”(比如二分查找答案)。

  1. 指针什么时候停下来?(循环条件)

相遇即停 left < right:当两个指针相遇时停止。适用于成对处理元素(如反转、求和)。

错开才停 left <= right:当两个指针错过时停止。适用于必须检查“中间那个元素”的情况(如二分查找)。

业务逻辑停止 while (sum != target) 题目保证一定有解,或者我们只关心找到答案的那一瞬间,特定场景才用

  1. 什么情况下移动哪个指针?(移动逻辑)

想让结果变大:通常是将左指针向右移(left++)。

想让结果变小:通常是将右指针向左移(right–)。

在找回文/反转:两个指针同时向中间移动。

相关练习题

1. LeetCode 167. 两数之和 II - 输入有序数组

题意: 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

Tips:最快”返回一个匿名数组:

1
return new int[]{a , b};

2. LeetCode 977. 有序数组的平方

题意: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

tips:数组两头大中间小,适合从后开始两头 PK 谁大填(需要一个临时变量来控制结果数组的下标递减)

3. LeetCode 11. 盛最多水的容器

题意: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量