zoukankan      html  css  js  c++  java
  • 11:盛最多水的容器(C++)

    题目地址:https://leetcode-cn.com/problems/container-with-most-water/

    题目描述

    给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

    说明:你不能倾斜容器,且 n 的值至少为 2

    题目示例

    示例:

    输入:[1,8,6,2,5,4,8,3,7]
    输出:49

    解题思路

    思路1:暴力。枚举左右柱子left和right所围成的面积,计算面积area=(y-x)*hegiht_dff,其中高度差height_diff=min(height[x], height[y]),返回最大面积值即可。可惜超时,时间复杂度O(n^2);

    思路2:左右夹逼。左右柱子left和right向中间收敛,如果左指针代表的左柱子高度较小,移动左指针向右,即left++,否则,移动右指针向左,即right--,当然了,如果左右柱子高度相等,则将左右柱子同时向中间移动一步。因为只需要遍历一遍数组,所以时间复杂度为O(n)。类似题目,还有167、240。

    程序源码

    思路1:超时

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

    思路2

    class Solution {
    public:
        int maxArea(vector<int>& height) {
            if(height.size() < 2) return 0;
            int area = 0;
            int left = 0, right = height.size() - 1;
            while(left < right)
            {
                int minHeight = height[left] < height[right]? height[left++]:height[right--];
                area = max(area, (right - left + 1)*minHeight);
            }
            return area;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    Train Problem(栈的应用)
    Code obfuscatio (翻译!)
    Milking Cows
    Sorting a Three-Valued Sequence(三值排序)
    Asphalting Roads(翻译!)
    FatMouse' Trade
    Fibonacci Again
    Yogurt factory
    经济节约
    Lucky Conversion(找规律)
  • 原文地址:https://www.cnblogs.com/wzw0625/p/13529994.html
Copyright © 2011-2022 走看看