双指针算法实战
本文重点解析两道经典的数组处理题目:盛最多水的容器和有效三角形的个数。这两道题都是考察双指针技巧的绝佳案例,通过优化搜索空间,能显著提升算法效率。
1. 盛最多水的容器
问题描述
给定一个非负整数数组 height,其中每个元素代表一条垂直线的高度。我们需要找到两条线与 x 轴共同构成的容器,使其能容纳最多的水。
面积计算公式为:
面积 = min(height[left], height[right]) * (right - left)
这其实就是木桶效应:容器的容量取决于最短的那块木板。
解题思路
暴力解法需要遍历所有可能的左右边界组合,时间复杂度为 O(N²)。但我们可以利用双指针将复杂度降至 O(N)。
核心逻辑在于:谁短谁移动。
假设左指针 left 指向较小值,右指针 right 指向较大值。此时如果移动 right(长边),宽度减小,高度受限于 left(短边)不会增加,面积必然减小。只有移动 left(短边),才有可能遇到更高的板子,从而获得更大的面积。
因此,我们初始化 left = 0, right = size - 1,每次计算当前面积并更新最大值,然后移动较短边的指针,直到两指针相遇。
代码实现
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int ans = 0;
while (right > left) {
// 计算当前面积
int ret = min(height[left], height[right]) * (right - left);
ans = max(ret, ans);
// 移动较短的一边
if (height[left] > height[right]) {
right--;
} else {
left++;
}
}
ans;
}
};


