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;
    }
  • 相关阅读:
    IO模型详解
    Java中的CAS实现原理
    深入理解幂等性
    区块链基本原理入门
    通俗易懂讲解IO模型
    java高级特性(4)--枚举
    static、final和finalize详解
    锁(3)-- DB锁
    浅析项目中的并发
    分布式(1)-- 分布式锁
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9102719.html
Copyright © 2011-2022 走看看