LeetCode刷题(C++)——Container With Most Water

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.

思路分析:本题的意思是对于一个数组[1,3,2,5,6],在坐标系上显示如下,目的是要寻找两条垂直线与x轴组成的容器之间的最大面积,感觉类似于木桶效应。下图中最大的面积是3和6之间组成的区域。


解法1:暴力解法,时间复杂度为O(n^2),通不过,稍微改进一下也是能够通过的。

class Solution {
public:
    int maxArea(vector<int>& height) {
        if (height.size() < 2)
			return 0;
		int maxarea = 0;
		for (int i = 0; i < height.size();++i)
		{
			if (height[i] != 0)
			{
				for (int j = i + (maxarea / height[i]);j < height.size();++j)           //如果是直接暴力解法 j=i+1;会超时
				{
					int len = j - i;
					int wid = (height[i] > height[j]) ? height[j] : height[i];
					int area = len*wid;
					if (area > maxarea)
						maxarea = area;
				}
			}
		}
		return maxarea;
    }
};

解法2: 时间复杂度为O(n)

设置两个指针i和j,分别指向数组的两头,当a[i]>a[j]时,j往前移动,否则i往后移动,同时之前最大的面积比较。

class Solution {
public:
    int maxArea(vector<int>& height) {
        if (height.size() < 2)
			return 0;
		int maxarea = 0;
		int i = 0, j = height.size() - 1;
		while (i < j)
		{
			maxarea = max(maxarea, min(height[i], height[j])*(j - i));
			if (height[i] < height[j])
				++i;
			else
				--j;
		}
		return maxarea;
    }
};








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值