Leetcode之Container With Most Water 问题

来源:互联网 发布:java开发的简单小游戏 编辑:程序博客网 时间:2024/06/09 18:01

问题描述:

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 linei 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 and n is at least 2

这道题目简单翻译一下:给定一系列非负整数a1,a2,...an,每一个整数代表的是一个坐标,坐标形式为(i,ai).总共有n条垂直的直线,每条直线的两个端点分别为(i, 0)和(i, ai).问题就是要我们找出其中的两条直线,使得这两条直线和X轴构成一个容器(实际上可以理解为求一个长方形),使得这个容器能够存放最多的水。

提示:我们不能把容器倾斜了来处理,并且n至少为2

问题来源:Container With Most Water(详细地址:https://leetcode.com/problems/container-with-most-water/#/description)

思路:首先,由题意简单分析一下,咱们给它换个意思,其实求的就是长方形的面积啊,说的那么高端。那么面积是个啥呢?应该是不难想到吧。

          为了不失一般性,假设两个点为(i, ai)和(j, aj)(假设j > i),面积S = (j - i) * min(ai, aj);

          然后下面的性质才是这道题的重点;

          1)如果当前ai,aj就是解(假设i < j),显然j坐标的右侧则不可能有比它长的边出现了。为什么咱能这么确定呢?采用反证法分析一下,如果存在更长的一条边ak出现的     话,显然ai和aj就不是咱们现在的解了吧,解就是ai和ak了吧,所以呢,j坐标的右侧是不会有比它高的边出现的;

          2)如果当前ai,aj就是解(假设i < j),显然i坐标的左侧则不可能有比它长的边出现了,这个就不用再解释了吧,和上面一模一样的道理。

基于上面这两点,自然而然就能联想到采用首尾两个指针来解决问题了吧,但是问题又来了,这两个指针怎么移动呢?

指针移动的准则:ai和aj当中较小的需要往中间靠拢(即i向右移或者j向左移),这样才能保证所求的面积最大啊。

代码:


感受:个人觉得就是题目第一次见比较新颖,其实把它的意思转换一下的话,代码实现应该是不难的吧。




              






原创粉丝点击