• 383. 装最多水的容器


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

     注意事项

    容器不可倾斜。

    样例

    给出[1,3,2], 最大的储水面积是2.

    看题看了半天,又看了下英文版才看懂

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

    Note: You may not slant the container.

    拿样例来说,就是(1, 1), (2, 3), (3, 2) 这三个点与其对应(i, 0)点连成的线。

    思路我们可以先想到暴力,所有线两两组合求面积,再选最大的。

    但是我们可以注意到,面积取决于

    1、两条线中较短的那条

    2、两条线之间的距离

    第二个比较好解决,我们可以从大到小(两边向内)遍历。

    但第一个的话,我们的思路是找到一个大的,再使第二个也尽量大。

    如果left>right, 那么我们可以变动right看能不能找到更大的right,否则变动left

    计算出来如果比上一个大就替换掉,否则保留

     1 int maxArea(vector<int> &heights) {
     2         // write your code here
     3         int left=0;
     4         int right=heights.size()-1;
     5         int area=0;
     6         while(left<right){
     7             area=max(area,min(heights[left], heights[right])*(right-left));
     8             if(heights[left] > heights[right]){
     9                 right--;
    10             }
    11             else{
    12                 left++;
    13             }
    14         }
    15         return area;
    16     }
  • 相关阅读:
    测试一个纸杯需要考虑什么?
    第三十三天-rsync高级同步工具深度实战
    运维人员必须熟悉的运维工具汇总
    Mysql 高负载排查思路
    查看mysql主从配置的状态及修正 slave不启动问题
    第三十二天-rsync高级同步工具基础
    第三十一天-两个例题
    linux mail 命令参数
    第三十天-ssh key企业批量分发自动化管理案例
    第二十九天-ssh服务重要知识深入浅出讲解
  • 原文地址:https://www.cnblogs.com/TheLaughingMan/p/8115548.html
Copyright © 2020-2023  润新知