
我来为你提供 LeetCode 11. 盛最多水的容器 的 C 语言实现。解题思路这道题使用双指针法Two Pointers是最优解- 初始化两个指针分别指向数组两端- 计算当前面积 min(height[left], height[right]) * (right - left)- 每次移动较短的那根线因为移动较长的线不可能使面积变大宽度减小高度受限于短边时间复杂度: O(n)空间复杂度: O(1)C 语言实现c#include stdio.hint maxArea(int* height, int heightSize) {int left 0;int right heightSize - 1;int max_area 0;while (left right) {// 计算当前容器的面积int width right - left;int h height[left] height[right] ? height[left] : height[right];int area width * h;// 更新最大面积if (area max_area) {max_area area;}// 移动较短的那根线if (height[left] height[right]) {left;} else {right--;}}return max_area;}// 测试代码int main() {int height1[] {1, 8, 6, 2, 5, 4, 8, 3, 7};int size1 sizeof(height1) / sizeof(height1[0]);printf(示例1: %d (期望: 49)\n, maxArea(height1, size1));int height2[] {1, 1};int size2 sizeof(height2) / sizeof(height2[0]);printf(示例2: %d (期望: 1)\n, maxArea(height2, size2));return 0;}代码说明要点 说明核心逻辑 双指针从两端向中间收缩移动策略 始终移动高度较小的指针正确性保证 对于任意一对 (i, j)最终都会被考虑到或证明不可能成为最优解为什么移动短边假设 height[left] height[right]当前面积为 height[left] * (right - left)。如果移动 right 指针- 宽度必然减小- 高度最大仍为 height[left]因为受限于左边界- 所以面积只会更小或不变如果移动 left 指针- 虽然宽度减小但有机会找到更高的左边界可能使面积增大因此移动短边是唯一能有机会找到更大面积的策略。这个解法在 LeetCode 上可以通过所有测试用例运行效率很高。