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

本文介绍了一种解决寻找二维平面上能容纳最大水量的两个垂直线段的问题。通过一次遍历,采用双指针从两端向中间逼近的方式,避免了暴力解法可能带来的效率问题。

上题目先:


题意:这道题的意思是,以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;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值