LeetCode 11:盛最多水的容器(C语言实现)
题目描述给定一个长度为n的整数数组height。有n条垂线第i条线的两个端点是(i, 0)和(i, height[i])。请你找出其中的两条线使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。注意你不能倾斜容器。示例示例 1输入height [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提示n height.length2 n 10^50 height[i] 10^4解题思路容器面积公式[area \min(height[left], height[right]) \times (right - left)]双指针策略初始化左右指针left 0; right heightSize - 1;每次计算面积并更新最大值移动较短的那一边指针因为移动长边只会让宽度减小面积不会增加。时间复杂度O(n)空间复杂度O(1)C语言代码实现#include stdio.h int maxArea(int* height, int heightSize) { int left 0; int right heightSize - 1; int max 0; while (left right) { int h height[left] height[right] ? height[left] : height[right]; int area h * (right - left); if (area max) max area; if (height[left] height[right]) left; else right--; } return max; } // 测试 int main() { int height[] {1,8,6,2,5,4,8,3,7}; int size sizeof(height)/sizeof(height[0]); printf(最大水量 %d\n, maxArea(height, size)); return 0; }示例解析对于输入[1,8,6,2,5,4,8,3,7]初始左右指针left0 (1)right8 (7)面积 min(1,7)*(8-0)8→ 移动左指针继续计算每次移动较短边最终最大面积为49left1 (8)right8 (7)面试小贴士这题属于双指针技巧题重点是“移动短板”的策略。面试时可用一句话总结思路左右双指针夹逼每次计算面积并移动较短边因为移动长边只会缩小宽度而不会增加高度。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418394.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!