LeetCode11:盛水最多的容器

题目

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为2.
leetcode11
示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

思路

双指针法(下文将height[i]简写为h[i]):
根据本示例,
Step1:计算h[0]与h[8],即首相与末项组成的面积
Step2:若h[0]<h[8],则计算h[1]与h[8]组成的面积;否则计算h[0]与h[7]的面积(保留大数)
Step3:比较h[1]与h[8]的大小(或h[0]与h[7]),根据Step2的保留大数原则进行取舍,重复上述规则,直到进行比较的是两个相邻项,那么这个过程中算出的最大的面积即为所求。

合理性:为什么若h[0]<h[8], Step2能跳过h[0]与h[7]的面积?
根据短板原理,
h[0]与h[8],组成的面积: 8min(h[0],h[8])=8h[0] (1)
h[0]与h[7],组成的面积: 7min(h[0],h[8])=7h[0] (2)
故(1)>(2),不用再计算(2)

代码

public class Solution {
    public int MaxArea(int[] height) {
         int len = height.Length;
                int start = 0;
                int end = len - 1;
                int Max = int.MinValue;
                while(start<end)
                {
                    int S = (end - start) * Math.Min(height[start], height[end]);
                    if(S>Max)
                    {
                        Max = S;
                    }
                    if (height[start] > height[end]) { end--; }
                    else { start++; }
                }
                return Max;
    }
}

实验结果

执行用时 :152 ms, 在所有 C# 提交中击败了91.23%的用户 内存消耗 :26.8 MB, 在所有 C#提交中击败了5.45%的用户

用时分布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值