算法练习(6):Container With Most Water

来源:互联网 发布:网吧网络为什么不卡 编辑:程序博客网 时间:2024/06/05 04:15

上题目先:


题意:这道题的意思是,以X轴为桶底,输入n个正整数作为桶边的高,然后这些桶边所在的位置正是它们在数组中的序号,也就是说两个桶边的距离是序号差的绝对值。

分析与思路:这道题目,由于是只需要找到能到达的最大容量值,看起来两层循环应该可以暴力求解的,但是我也不清楚直接暴力求解会不会超时,我是采用了一点稍微巧妙一点的方法的。我的想法是,容量大小由较短边和底长决定的,当一开始取底最长的时候,每次缩短一个单位的底长,这种情况下,只有当前最短边比上一轮的最短边高才有可能增加容量(底长变短了)。所以我的方法是,一开始,左右桶边分别先取最左最右的两条边,然后比较这两条边,哪边的比较小则向中间靠近一位的距离,直到两条边重合,注意的是,当这个比较过程中两条边高度相等,谁向中间移动一位后更高则谁移动。还有一个小细节,由于每次的容量都是由两边中较短边决定的,所以我把计算容量时边长短的判断与上面的判断重用了。思路都体现在代码的注释中了,如下:

class Solution {public:int maxArea(vector<int>& height) {int maxV = 0;//最大容量int l = 0, r = height.size() - 1;//桶的左右边序号int temp = 0;//代表当前容量while (l != r) {//直到两条桶边重合if (height[l] < height[r]) {//当右边比左边高时temp = height[l] * (r - l);//当前条件下的容量l++;//左边向中间靠拢一位} else if(height[l] > height[r]) {temp = height[r] * (r - l);r--;}else {//当两边高度一样时temp = height[r] * (r - l);if (height[l + 1] > height[r - 1]) {//谁往中间一位后高度更高则谁移动l++;}else { r--; }}if (temp > maxV) maxV = temp;//更新最大容量}return maxV;}};


原创粉丝点击