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.

Note: You may not slant the container.

题目大概是说在笛卡尔坐标系中给定n个点, 这n个点的坐标都在x轴上方, 向x轴作垂线段可得到x条线段. 从中选择两条线段, 使得这两条线段和x轴形成的水缸得面积最大.

解题思路

最简单粗暴的方法是穷举这 n22 种组合方式, 不用想也知道妥妥的TLE.

假设有2个指针i, j. i从最左侧出发, j从最右侧出发. 因为水缸的高度是由二者中的较小值决定的. 当height[i] < height[j]时, ++ i. 假设i的值不变, – j, 不可能得到更优解(因为水缸的长度在减小, 高度不可能超过height[i]). 反之, – j. 并记录每次移动i, j后的水缸面积, 并更新水缸面积的最大值.

源代码

public class Solution {
    public int maxArea(int[] height) {
        int i = 0, j = height.length - 1;
        int maxArea = getArea(height, i, j);

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

            int currentArea = getArea(height, i, j);
            if ( currentArea > maxArea ) {
                maxArea = currentArea;
            }
        }
        return maxArea;
    }

    private int getArea(int[] height, int i, int j) {
        int a = Math.min(height[i], height[j]);
        int b = j - i;

        return a * b;
    }

    public static void main(String[] args) {
        Solution s = new Solution();

        int[] height = {2, 3, 10, 5, 7, 8, 9};
        System.out.println(s.maxArea(height));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值