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

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

    注意:你不能倾斜容器,n 至少是2。

    思路:一开始我以为要用动态规划做,比如建立一个辅助数组dp[i][j],表示从i到j的最大容器。这样最后我直接查看dp[0][n]的值就可以。并且dp[i][i]=0,但是我并不知道动态转化方程是什么。比如dp[i][j]从何来。好像并不能从dp[i-1][j]或者dp[i][j-1]中得到dp[i][j]。

    应该是这个问题并不适用dp。

    这道题目我们可以从两头开始判断,取height[i]与height[j]中较小的值,乘以j-i就是以首尾为边界的最大容量。那么我们可以慢慢往中间靠,如果height[i]>height[j],我们就将j--,因为我们如果移动i,在底本来就减少1的情况下,高度再舍弃较大的那个,那么新的容量一定减小了

    int maxArea(vector<int>& height)
    {
        int s=height.size();
        //vector<vector<int> >dp(s,vector<int>(s));
        int i=0,j=s-1;
        int temp=0,maxarea=0;
        while(i<j)
        {
            temp=min(height[i],height[j])*(j-i);
            maxarea=maxarea>temp?maxarea:temp;
            if(height[i]>height[j])
            {
                j--;
            }
            else
                i++;
        }
        return maxarea;
    }
  • 相关阅读:
    mailing list的原理
    关于结构体的使用
    c++ template
    IDA逆向
    重定向 301 302
    linux信号
    cmake编译选项
    mongodb超时
    普通java工程的resources目录寻址
    Vue基础---->VueJS的使用(二)
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9102719.html
Copyright © 2011-2022 走看看