Leetcode11. 盛最多水的容器

Leetcode11. 盛最多水的容器

题目:
给你 n n n 个非负整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1a2...an,每个数代表坐标中的一个点 ( i , a i ) (i, a_i) (i,ai) 。在坐标内画 n n n 条垂直线,垂直线 i 的两个端点分别为 ( i , a i ) (i, a_i) (i,ai) ( i , 0 ) (i, 0) (i,0)。找出其中的两条线,使得它们与 x x x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n n n 的值至少为 2 2 2
在这里插入图片描述

题解:
使用双指针方法:
设双指针 i , j i,j i,j分别为容器的两端;
1.若向内移动短板,水槽的短板 m i n ( h [ i ] , h [ j ] ) min(h[i], h[j]) min(h[i],h[j]) 可能变大,因此水槽面积 S ( i , j ) S(i, j) S(i,j) 可能增大。
2.若向内移动长板,水槽的短板 m i n ( h [ i ] , h [ j ] ) min(h[i], h[j]) min(h[i],h[j])不变或变小,下个水槽的面积一定小于当前水槽面积。
因此,向内收窄短板可以获取面积最大值。换个角度理解:

  • 如果 h e i g h t ( i ) < h e i g h t ( j ) height(i)<height(j) height(i)<height(j),则移动 i i i i + 1 i+1 i+1
  • 如果 h e i g h t ( i ) > = h e i g h t ( j ) height(i)>=height(j) height(i)>=height(j),则移动 j j j j − 1 j-1 j1

java 代码:

public static int maxArea(int[] height) {
        int l = 0;
        int r = height.length;
        int maxArea = 0;
        while (l < r) {
            if (height[l] < height[r]) {
                maxArea = Math.max(maxArea, (r - l) * height[l]);
                l++;
            } else {
                maxArea = Math.max(maxArea, (r - l) * height[r]);
                r--;
            }
        }
        return maxArea;
    }

scala代码:

def maxArea(height: Array[Int]): Int = {
    var i = 0
    var j = height.length - 1

    var area = 0
    while (i < j) {
      if (height(i) < height(j)) {
        area = math.max(area, (j - i) * height(i))
        i = i + 1
      } else {
        area = math.max(area, (j - i) * height(j))
        j = j - 1
      }
    }
    area
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值