/**
* 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. Linux驱动之一个简单的输入子系统程序编写

    的在Linux驱动之输入子系统简析已经分析过了输入子系统的构成,它是由设备层.核心层.事件层共同组成的.其中核心层提供一些设备层与事件层公用的函数,比如说注册函数.反注册函数.事件到来的处理函数等等: ...

  2. PHP开发——环境安装

    PHP环境 Apache IDE的选择

  3. py2和py3的区别总结

    1.编码 python2默认编码方式ASCII码(不能识别中文,要在文件头部加上  #-*- encoding:utf-8 -*-  指定编码方式) python3默认编码方式unicode(可识别中 ...

  4. 关于java中的一些循环

    1:switch语句 (1)格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ... default: 语句体n+1; bre ...

  5. 微信小程序设置背景铺满全屏

    参考方法: 新版本升级取消了默认page的100%的特性 需要在app.wxss文件中加入如下代码: page{ height:100%; }

  6. small_trick_on_IT/PC

    1.浏览器下ctrl+F可实现文本查找 其余还有 2.将软件目录放到环境变量Path下,Ctrl+R输入.exe软件名即可调用. (tips:可把常用软件建立快捷方式,统一放在某一目录下噢!)

  7. zeromq学习记录(三)使用ZMQ_PULL ZMQ_PUSH

    /************************************************************** 技术博客 http://www.cnblogs.com/itdef/   ...

  8. powerDesigner 正向工程生成sql注释

    找到script-->objects-->column-->add value内容如下: %:COLUMN% %:DATATYPE%[.Z:[%Compressed%? compre ...

  9. SQL SERVER中LIKE在Char和nChar输出结果不一致解惑

    一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...

  10. 基于OpenCV的图书扫描识别程序开发

    1.AndroidStudio环境配置 https://www.cnblogs.com/little-monkey/p/7162340.html