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

    题目:

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (iai) 和 (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

    思路:

      双指针

      我们知道,面积是等于高度乘以宽度,当宽度一定时,高度是由较短的一边来决定的,如果我们想去使面积增加,只有去往里移动较短的板,面积才有可能增加,因为如果移动较长的板,此时的高度可能还是由较短的一段决定,而移动较短的板,下一个板可能会变长,进而使面积增加。

      所以,我们在数组的中使用两个指针,一个放到开头,一个放到末尾,上诉算法移动指针,不断地去更新最大面积

    代码:

    class Solution {
    public:
        int maxArea(vector<int>& height) {
            int n = height.size();
            
            int l = 0;
            int r = n-1;
            int ans = -1;
            while(l<r)
            {
                int a = height[l];
                int b = height[r];
                int tmp = min(a,b)*(r-l);
                if(tmp>ans) ans = tmp;
                if(a<b) l++;
                else r--;
            }
            
            return ans;
        }
    };
  • 相关阅读:
    怎么查看京东店铺的品牌ID
    PPT编辑的时候很卡,放映的时候不卡,咋回事?
    codevs 1702素数判定2
    codevs 2530大质数
    codevs 1488GangGang的烦恼
    codevs 2851 菜菜买气球
    hdu 5653 Bomber Man wants to bomb an Array
    poj 3661 Running
    poj 1651 Multiplication Puzzle
    hdu 2476 String Painter
  • 原文地址:https://www.cnblogs.com/simplekinght/p/9572694.html
Copyright © 2011-2022 走看看