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

    https://leetcode-cn.com/problems/container-with-most-water/

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

    说明:你不能倾斜容器。

    示例 1:

    输入:[1,8,6,2,5,4,8,3,7]
    输出:49
    解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

    示例 2:

    输入:height = [1,1]
    输出:1

    示例 3:

    输入:height = [4,3,2,1,4]
    输出:16

    示例 4:

    输入:height = [1,2,1]
    输出:2

    提示:

    n = height.length
    2 <= n <= 3 * 104
    0 <= height[i] <= 3 * 104
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/container-with-most-water
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    一开始看到这个题,觉着还挺简单,首先考虑最左边,找到第一个最高的,因为矮的肯定没有高的存的水多,然后从右边遍历,找面积最大的,但是想了想,不对,首先一个反例就是,如果右边都很矮,最高的也比最左边的矮,那么从左边找最高的就没意义了,还减少了面积。所以看了题解,发现使用双指针。

    为什么使用双指针,按照题解中介绍,因为有两个边界,所以正好可以覆盖。使用双指针,初始值肯定一个在最左边,一个在最右边,那么后续呢?如何遍历呢?向中间移动,移动短的那一个。为什么移动短的那一个呢?因为如果移动长的,那么这个水池高最高还是短的那根,所以不可能容积变大,肯定变小,因为长度还变小了。如果移动短的,那么下一个有可能高度会变高,这样容积就有可能会变大。代码如下

    class Solution {
    public:
        int sumarea(int i, int j, vector<int>& height1)
        {
            int a = height1[i];
            if(height1[j] < a)
            {
                a = height1[j];
            }
            return a * (j - i);
        }
        int maxArea(vector<int>& height) {
            int lefti = 0;
            int righti = height.size() - 1;
            int maxnum = 0;
            while(lefti < righti)
            {
                int tmparea = sumarea(lefti, righti, height);
                if(tmparea > maxnum)
                {
                    maxnum = tmparea;
                }
                if(height[lefti] > height[righti])
                {
                    righti--;
                }
                else
                {
                    lefti++;
                }
            }
            return maxnum;
        }
    };
    
    

    版权声明:本文版权归作者所有,如需转载,请标明出处

  • 相关阅读:
    浅谈页面中的焦点
    简单的jQuery幻灯片实现
    从is(":checked")说起
    通过Javascript得到URL中的参数(query string)
    Javascript设置对象属性为"只读"
    Javascript判断两个日期是否相等
    利用HttpWebRequest访问WebApi
    利用Newtonsoft.Json实现Json序列化与反序列化
    在ASP.NET MVC中以post方式传递数组参数的示例
    SQL Server 锁表、查询被锁表、解锁相关语句
  • 原文地址:https://www.cnblogs.com/studywithallofyou/p/14481882.html
Copyright © 2011-2022 走看看