zoukankan      html  css  js  c++  java
  • 盛水最多的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

    第一遍用暴力解法:

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

    方法2:

    有人说水的最大体积由最长木板决定,只有移动短的木板那头,才有可能使得水

    的体积变大。好像称作双指针。

    class Solution {
    public:
        int maxArea(vector<int>& height) {
            int left = 0;
            int right = height.size()-1;
            int region = right * min(height[0], height[right]);
            while(left < right) {
                region = max(region, (right-left) * min(height[right], height[left]));
                //cout << left << "," << right << " ";
                if(height[left] < height[right] ) {
                    left++;
                } else {
                    right--;
                }
            }
            
            return region;
        }
    };
    The Safest Way to Get what you Want is to Try and Deserve What you Want.
  • 相关阅读:
    php分页问题
    php中memcached的使用
    Linux安装Git
    day06
    day07
    day03
    day05
    day04
    列表的操作
    初识数据类型
  • 原文地址:https://www.cnblogs.com/Shinered/p/11222925.html
Copyright © 2011-2022 走看看