/**
* 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. PHP 实现单链表

    数据结构是计算机存储.组织数据的方式,结构不同那么数据的检索方式和效率都不一样, 常用的数据结构有  数组 .栈 .队列 .链表 .树.堆 今天讲下单链表,单链表是一种链式存取的数据结构, 跟顺序链表 ...

  2. 李白打酒——C++

    话说大诗人李白,一生好饮.幸好他从不开车.     一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱:     无事街上走,提壶去打酒.     逢店加一倍,遇花喝一斗.     这一路上,他 ...

  3. RobotFramework 模拟http接口登录自动化脚本

    RobotFramework 模拟自动化登录脚本思路: 先获取页面cookie值,然后根据cookie值加上请求体提交登录: 一.获取cookie: 以下脚本获取cookie值,并把改脚本封装为关键字 ...

  4. pc send instructor pc ad

     1. #include <string.h> #include <intrins.h> // 加入此头文件后,可使用_nop_库函数 #define MAIN_Fosc 11 ...

  5. 数据库-SQL语句:删除和修改语句-列类型-列约束

    使用MySQL客户端连接服务器的两种方式: (1)交互模式: ——查 mysql.exe  -h127.0.0.1  -uroot  -p mysql   -uroot (2)脚本模式:——增删改 m ...

  6. js-function复制变量值和传递参数

    <title>function复制变量值</title></head><body> <script> var a={ num:10 } // ...

  7. JQuery Mobile - 固定住页面和页脚

    在点击页面空白时候,页眉和页脚会隐藏,在页眉和页脚加入以下代码就可以了: data-tap-toggle ="false" 例子: <div data-role=" ...

  8. 47_并发编程-线程python实现

    一.Threading模块   1.线程的创建 - 方式一 from threading import Thread import time def sayhi(name): time.sleep(2 ...

  9. Ubuntu18.04安装网易云音乐

    一. 安装 去网易云官网下载对应于ubuntu系统的安装包 安装依赖 dpkg -s libcanberra-gtk-module #检查依赖是否安装 sudo apt install libcanb ...

  10. WebRTC 学习之 WebRTC 简介

    本文使用的WebRTC相关API都是基于Intel® Collaboration Suite for WebRTC的. 相关文档链接:https://software.intel.com/sites/ ...