letcode 11.Container With Most Water(最大容器)

给定n( n ≥ 2 n\ge 2 n2)个非负整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,其中每一个代表一个坐标点 ( i , a i ) (i,a_i) (i,ai),绘制n条垂线,使得线的两个端点为 ( i , a i ) (i,a_i) (i,ai) ( i , 0 ) (i,0) (i,0)。找到两条线,使得这两条线和x轴所形成的容器能乘最多的水。如下图所示:

Given n non-negative integers a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an , where each represents a point at coordinate ( i , a i ) (i,a_i) (i,ai). n vertical lines are drawn such that the two endpoints of line i is at ( i , a i ) (i,a_i) (i,ai) and ( i , 0 ) (i,0) (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,8,6,2,5,4,8,3,7]所形成的图形

样例:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

如果枚举所有边,那就有 C n 2 C_n^2 Cn2中可能,也就是时间复杂度为 O ( n 2 ) O(n^2) O(n2),但是使用贪心法就可以使得时间复杂度变为 O ( n ) O(n) O(n)

因为:面积=底边的长度*(两边中较低的一条的长度)

要使面积尽可能大,就要使乘法的两个因子尽可能大,所以我们从底边最大处开始,接下来底边只可能比原来的小,想要找到面积更大的,就要使“两边中较低的长度”比原来大。所以要将短的那条边换掉。然后重复该过程。直到左右指针相撞。

因为left和right都在“向中间靠拢”,所以循环次数为n次,时间复杂度为 O ( n ) O(n) O(n)

完整代码:

class Solution
{
public:
    int maxArea(vector<int>& height)
    {
        int a=0;
        int ans=0;
        int left=0,right=height.size()-1;
        while(left<right)
        {
            a=(right-left)*(height[left]<height[right]?height[left++]:height[right--]);
            ans = ans > a? ans : a;
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值