zoukankan      html  css  js  c++  java
  • #leetcode刷题之路11-盛最多水的容器

    给定 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,8,6,2,5,4,8,3,7]
    输出: 49

    暴力法太没意思了;这其实就是个求面积的问题.

    我们看能否使用技巧来解决这个问题:

    1.首先,显而易见,最终肯定选择的是这么多柱子中的两个,这两个柱子的关系是一个在左一个在右,因此,所以我们可以设计两个指针(begin,end)分别从两头向中间移动,分别找到左右这俩柱子。

    2.那么如何移动呢?我们把初始的指针放在两头。这就围成了一个初始的矩形面积area=短的柱子(假设是begin)长度*(end-begin)。那么接下来该让哪一个指针往中间移动一小步呢?

      2.1如果移动高的柱子(假设是end)那个指针,

        2.1.1如果指针移动到了一个比柱子(begin)高的柱子上,此时面积area=短的柱子(begin)长度*(end-begin-1),这不是比之前小了?

        2.1.2如果指针移动到了一个比柱子(begin)低的柱子上,此时面积area=新的短的柱子(begin)长度*(end-begin-1),这不是更小了?

        因此,移动高的那个柱子的指针,只会让面积变小!!!

      2.2如果移动矮(假设是begin)的柱子的指针

         2.2.1如果指针移动到了一个比柱子(end)高的柱子上,此时面积area=短的柱子(end)长度*(end-begin-1),面积可能变大

        2.2.2如果指针移动到了一个比柱子(end)低的柱子上,此时面积area=新的短的柱子(begin)长度*(end-begin-1),面积变小

        因此,选择移动矮的指针

    #include <iostream>
    #include <vector>
    using  namespace std;
    
    int maxArea(vector<int>& height) {
        int len=height.size();
        int area=0;
        int begin=0,end=len-1;
        while(begin<end)
        {
            int flag=height[begin]<height[end]?begin:end;//看begin和end哪个位置的数大
           area=area>(end-begin)*height[flag]?area:(end-begin)*height[flag];
            flag==begin?begin++:end--;
        }
        return area;
    }
    
    int main() {
        vector<int> height={1,8,6,2,5,4,8,3,7};
        std::cout <<maxArea(height)<< std::endl;
        return 0;
    }

  • 相关阅读:
    郁闷的出纳员 平衡二叉树(SBT)
    POJ 3225 Help with Intervals (线段树,区间成段更新)
    HDU 3038 How Many Answers Are Wrong (并查集)
    POJ 1733 Parity game (HASH+并查集)
    POJ 1417 True Liars(并查集+DP)
    POJ 2912 Rochambeau(枚举+并查集)
    UILabel添加发光效果
    TinyMCE integration with phpBB3
    快速重传与快速恢复算法
    TCP的超时与重传
  • 原文地址:https://www.cnblogs.com/biat/p/10450090.html
Copyright © 2011-2022 走看看