LeetCode 11 Container With Most Water (C,C++,Java,Python)

Problem:

Given n non-negative integers a1, a2,
..., an, where each represents a point at coordinate (i, ai). n vertical
lines are drawn such that the two endpoints of line i is at (i, ai) 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.

Solution:

下面以例子:   [4,6,2,6,7,11,2] 来讲解。

1.首先假设我们找到能取最大容积的纵线为 i , j (假定i<j),那么得到的最大容积 C = min( ai , aj ) * ( j- i) ;

2.下面我们看这么一条性质:

①: 在 j 的右端没有一条线会比它高! 假设存在 k |( j<k && ak > aj) ,那么  由 ak> aj,所以 min( ai,aj, ak) =min(ai,aj) ,所以由i, k构成的容器的容积C‘ = min(ai,aj ) * ( k-i) > C,与C是最值矛盾,所以得证j的后边不会有比它还高的线;

②:同理,在i的左边也不会有比它高的线;

这说明什么呢?如果我们目前得到的候选: 设为 x, y两条线(x< y),那么能够得到比它更大容积的新的两条边必然在  [x,y]区间内并且 ax‘ > =ax , ay‘>= ay;

3.所以我们从两头向中间靠拢,同时更新候选值;在收缩区间的时候优先从  x, y中较小的边开始收缩;

题目大意:

在X轴上给定一些竖线,竖线有长度,求两条竖线与X轴构成的一个容器能容纳最多的水的面积

解题思路:

如Solution,时间复杂度O(n)

Java源代码(用时373ms):

public class Solution {
    public int maxArea(int[] height) {
        int Max=-1,l=0,r=height.length-1;
        while(l<r){
            int area=(height[l]<height[r]?height[l]:height[r])*(r-l);
            Max=Max<area?area:Max;
            if(height[l]<height[r]){
                int k=l;
                while(l<r && height[l]<=height[k])l++;
            }else{
                int k=r;
                while(l<r && height[r]<=height[k])r--;
            }
        }
        return Max;
    }
}

C语言源代码(用时12ms):

int maxArea(int* height, int heightSize) {
    int Max=-1,area,l=0,r=heightSize-1,k;
    while(l<r){
        area=(height[l]<height[r]?height[l]:height[r])*(r-l);
        Max=Max<area?area:Max;
        if(height[l]<height[r]){
            k=l;
            while(l<r && height[l]<=height[k])l++;
        }else{
            k=r;
            while(l<r && height[r]<=height[k])r--;
        }
    }
    return Max;
}

C++源代码(用时30ms):

class Solution {
public:
    int maxArea(vector<int>& height) {
        int Max=-1,l=0,r=height.size()-1,area,k;
        while(l<r){
            area=(height[l]<height[r]?height[l]:height[r])*(r-l);
            Max=Max<area?area:Max;
            if(height[l]<height[r]){
                k=l;
                while(l<r && height[l]<=height[k])l++;
            }else{
                k=r;
                while(l<r && height[r]<=height[k])r--;
            }
        }
        return Max;
    }
};

Python源代码(用时152ms):

class Solution:
    # @param {integer[]} height
    # @return {integer}
    def maxArea(self, height):
        Max=-1;l=0;r=len(height)-1
        while l<r:
            area=(height[l] if height[l]<height[r] else height[r])*(r-l)
            Max=Max if Max>area else area
            if height[l]<height[r]:
                k=l
                while l<r and height[l]<=height[k]:l+=1
            else:
                k=r
                while l<r and height[r]<=height[k]:r-=1
        return Max

时间: 2024-10-26 04:47:56

LeetCode 11 Container With Most Water (C,C++,Java,Python)的相关文章

[LeetCode] 011. Container With Most Water (Medium) (C++/Java/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 011.Container_With_Most_Water (Medium) 链接: 题目:https://oj.leetcode.com/problems/container-with-most-water/ 代码(github):https://github.com/illuz/leetcode 题意: 给一些

Leetcode 11. Container With Most Water (two pointers)

Leetcode: 11 there are two ways to deal with two pointers one is O(n), two pointers moves from both side Another is O(2N), two pointer move from the same side Idea for this, choose the first one and then if there is a smaller one, change that corresp

LeetCode 11. Container With Most Water (装最多水的容器)

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

LeetCode 11 Container With Most Water(最大水容器)

翻译 给定n个非负整数a1,a2,...,an,其中每个代表一个点坐标(i,ai). n个垂直线段例如线段的两个端点在(i,ai)和(i,0). 找到两个线段,与x轴形成一个容器,使其包含最多的水. 备注:你不必倾倒容器. 翻译 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such tha

[LeetCode] 11. Container With Most Water My Submissions Question 解题思路

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

[LeetCode] 11. Container With Most Water 装最多水的容器

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

[leetcode]11. Container With Most Water存水最多的容器

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

LeetCode 11 Container With Most Water

题目如下: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a co

LeetCode 11 Container With Most Water 装尽可能多的水

题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a cont