【LeetCode】Container with Most Water

原题: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.

大意:给你n个点,每个点表示直线(i,0)(i,n),i为第i个点。选取两条直线组成一个容器。求容器的最多能够装多少水。

丫丫的,这个英文题干描述看了半天也看不懂说的是什么意思。百度了一下才知道最后要返回水的最大体积。不知道是题目坑还是我坑。~(>_<)~

先说思路:

引用前辈的解析:

设置两个指针i, j, 一头一尾, 相向而行. 假设i指向的挡板较低, j指向的挡板较高(height[i] < height[j]).
下一步移动哪个指针?
– 若移动j, 无论height[j-1]是何种高度, 形成的面积都小于之前的面积.
– 若移动i, 若height[i+1] <= height[i], 面积一定缩小; 但若height[i+1] > height[i], 面积则有可能增大.
综上, 应该移动指向较低挡板的那个指针.


上面这些说完,开始正题。

注意以下代码:

int i = 0, j = height.length - 1;
        int count = 0, mini = 0;

        while (i < j) {

            /**
             * 就是这一句
             */
            mini = height[i] < height[j] ? height[i] : height[j];

            count = count > (mini * (j - i)) ? count : (mini * (j - i));

            if (height[i] < height[j]) {
                i++;
            } else {
                j--;
            }
        }
        return count;

以上是beats 42%。

假如改为:

//即在while循环中每次都初始化int型变量
int mini = height[i] < height[j] ? height[i] : height[j];

结果就是超时。因为初始化变量比较耗时,所以尽量避免在循环中多次初始化同一个变量

假如改为:

//即在while循环中调用函数
mini=Math.min(height[i],height[j]);

结果虽然通过,但是仅为beats 10%。因为调用函数比较耗时,所以在循环中尽量使用普通运算代替简单的函数调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值