/**
* Source : https://oj.leetcode.com/problems/container-with-most-water/
*
* Created by lverpeng on 2017/7/7.
*
* 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.
*
* 对于双层循环问题是否可以使用从两头向中间靠近的方式来减少循环嵌套层数,比如这道题目里面,记录首尾两个index,每次将值较小处的index向中间移动
* 找出问题有什么特点、规律、性质,利用这些东西去解决,可能会得到更好的解。比如这道提里面,最终的i、j,arr[i]总是大于其左边的任意一个数,arr[j]总是大于其右边的任意一个数
*
*/ public class ContainerWithMostWater { /**
* 求出任意两根线之间能盛放的水最多的横坐标i,j,也就是求出面积最大的i,j
* 普通解法,直接循环所有的线,找出面积最大的i,j
*
* @param arr
* @return
*/
public int maxArea (int[] arr) {
int maxArea = 0;
int tempArea = 0;
int loopCount = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j ++) {
tempArea = Math.min(arr[i], arr[j]) * Math.abs(arr[j] - arr[i]);
if (tempArea > maxArea) {
maxArea = tempArea;
}
loopCount ++;
}
}
System.out.println("maxArea:loopCount-----" + loopCount);
return maxArea;
} /**
* 从两边向中间移动,比较得出面积最大的
* 每次移动:将较短的边向中间移动
*
* 上面是两层循环,这里只需要一层
*
* @param arr
* @return
*/
public int maxArea1 (int[] arr) {
int maxArea = 0;
int tempArea = 0;
int low = 0;
int high = arr.length - 1;
int loopCount = 0;
while (low < high) {
tempArea = Math.min(arr[low], arr[high]) * Math.abs(arr[low] - arr[high]);
if (tempArea > maxArea) {
maxArea = tempArea;
}
if (arr[low] < arr[high]) {
low ++;
} else {
high --;
}
loopCount ++;
}
System.out.println("maxArea1:loopCount-----" + loopCount);
return maxArea;
} /**
* 假设最终找到i,j,那么arr[i] 要大于0-i(i左边)之间的数,arr[j]要大于j-arr.length(j右边)之间的数,
* 那么如果arr[i]较小,i可以一直右移知道找到比它本身大的数,如果arr[j]较小,j可以一直左移一直找到比他大的数,计算一次面积,并比较
* 直观理解就是:一个矩形面积要最大,在长度缩小的情况下,要拿更大的宽度来弥补
*
* 比上面上一些运算,循环次数是一样的
* @param arr
* @return
*/
public int maxArea2 (int[] arr) {
int tempArea = 0;
int maxArea = 0;
int low = 0;
int high = arr.length - 1;
int loopCount = 0;
while (low < high) {
tempArea = Math.min(arr[low], arr[high]) * Math.abs(arr[low] - arr[high]);
if (tempArea > maxArea) {
maxArea = tempArea;
}
if (arr[low] < arr[high]) {
int nextLow = low + 1;
while (nextLow < high && arr[low] > arr[nextLow]) {
nextLow ++;
loopCount ++;
}
low = nextLow;
} else {
int nextHigh = high - 1;
while (nextHigh > low && arr[high] > arr[nextHigh]) {
nextHigh--;
loopCount ++;
}
high = nextHigh;
}
loopCount ++;
}
System.out.println("maxArea2:loopCount-----" + loopCount);
return maxArea;
} public static void main(String[] args) {
int[] arr = new int[]{4,6,2,6,7,11,2};
ContainerWithMostWater containerWithMostWater = new ContainerWithMostWater();
System.out.println(containerWithMostWater.maxArea(arr));
System.out.println(containerWithMostWater.maxArea1(arr));
System.out.println(containerWithMostWater.maxArea2(arr));
} }

leetcode — container-with-most-water的更多相关文章

  1. LeetCode:Container With Most Water,Trapping Rain Water

    Container With Most Water 题目链接 Given n non-negative integers a1, a2, ..., an, where each represents ...

  2. [LeetCode] Container With Most Water 装最多水的容器

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...

  3. [LeetCode]Container With Most Water, 解题报告

    前言 难怪LeetCode OJ在找工作时被很多人推荐,发现了这道最大蓄水题目就是美团的笔试最后一道题,当时我霸笔只有着一道题目没有答出来,因此也就没有获得面试机会,可惜了 题目 Given n no ...

  4. C++LeetCode:: Container With Most Water

    本来写的题目不是这个,而是字符串匹配,考虑了很多情况写了很久最后看了solution,发现可以用动态规划做.感觉被打击到了,果断先放着重新写一个题,后面心情好了再重新写吧,难过.每天都要被LeetCo ...

  5. leetcode Container With Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  6. [LeetCode] Container With Most Water 简要分析

    前言 这题非要说贪心的话也算是吧,不过最主要的特征还是双指针.LC的题好像不少都是扔倆头尾指针然后遍历一遍完事儿的.这道题倒是“短板效应”的不错体现了. 题目 题目链接 Given n non-neg ...

  7. [Leetcode] Container With Most Water ( C++)

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...

  8. LeetCode——Container With Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  9. LeetCode Container With Most Water (Two Pointers)

    题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...

  10. [Leetcode] container with most water 最大水容器

    Given n non-negative integers a1 , a2 , ..., an , where each represents a point at coordinate (i, ai ...

随机推荐

  1. centos 7 安装redis 3.2.1

    https://www.cnblogs.com/zuidongfeng/p/8032505.html 下载安装包: http://download.redis.io/releases/ 根据需要自己选 ...

  2. centos 解压

    解压 tar –xvf file.tar //解压 tar包 tar -xzvf file.tar.gz //解压tar.gz tar -xjvf file.tar.bz2   //解压 tar.bz ...

  3. Boost::bind使用详解

    1.Boost::bind 在STL中,我们经常需要使用bind1st,bind2st函数绑定器和fun_ptr,mem_fun等函数适配器,这些函数绑定器和函数适配器使用起来比较麻烦,需要根据是全局 ...

  4. Call to undefined function Workerman\posix_getpid()

    安装扩展 yum install php-posix

  5. JPanel JScrollPanel

    JPanel 和 JScrollPanel 都属于面板,也是 Swing 中间容器,可以作为容器存放组件,但必须被添加到其他容器中. JPanel 可以聚集一些组件来布局, JScrollPanel ...

  6. boost学习 泛型编程之traits 学习

    traits使用的场景一般有三种  分发到不同处理流程 解决C++代码中某些无法编译的问题 比如一个图书馆的代码,接受书籍并收入到不同类别中 template<class T> // T表 ...

  7. Zookeeper系列2 原生API 以及核心特性watcher

    原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...

  8. AX_Dialog

    Dialog                      dialog  = new Dialog("@SYS1052");  DialogField                 ...

  9. java29

    1.封装小练习--长方形 创建长方形类 使用getset方法 利用返回值方法计算长方形的面积,周长. 保证长方形的长宽为整数 2.继承小练习--猫狗 当父类中有构造器时,子类也要有构造器,并且要求设置 ...

  10. Java ,python面向对象的继承及其区别

    JAVA JAVA继承基本样式 class Demo extends Object{ Demo(int a){ this(); } Demo(){ super(); } } java默认继承Objec ...