leetcode — container-with-most-water
/**
* 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的更多相关文章
- LeetCode:Container With Most Water,Trapping Rain Water
Container With Most Water 题目链接 Given n non-negative integers a1, a2, ..., an, where each represents ...
- [LeetCode] Container With Most Water 装最多水的容器
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- [LeetCode]Container With Most Water, 解题报告
前言 难怪LeetCode OJ在找工作时被很多人推荐,发现了这道最大蓄水题目就是美团的笔试最后一道题,当时我霸笔只有着一道题目没有答出来,因此也就没有获得面试机会,可惜了 题目 Given n no ...
- C++LeetCode:: Container With Most Water
本来写的题目不是这个,而是字符串匹配,考虑了很多情况写了很久最后看了solution,发现可以用动态规划做.感觉被打击到了,果断先放着重新写一个题,后面心情好了再重新写吧,难过.每天都要被LeetCo ...
- leetcode Container With Most Water
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- [LeetCode] Container With Most Water 简要分析
前言 这题非要说贪心的话也算是吧,不过最主要的特征还是双指针.LC的题好像不少都是扔倆头尾指针然后遍历一遍完事儿的.这道题倒是“短板效应”的不错体现了. 题目 题目链接 Given n non-neg ...
- [Leetcode] Container With Most Water ( C++)
题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...
- LeetCode——Container With Most Water
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- LeetCode Container With Most Water (Two Pointers)
题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...
- [Leetcode] container with most water 最大水容器
Given n non-negative integers a1 , a2 , ..., an , where each represents a point at coordinate (i, ai ...
随机推荐
- 微信H5开发
1,line-height 不垂直居中 解决方法:用padding写高度 2,手指滑动事件 touchmove 3,页面滚动事件:touchmove 4,要写不同手机适配的基数font-siz ...
- (百度)centos7上安装apache指南
https://jingyan.baidu.com/album/c843ea0bb5ff3977931e4a14.html?picindex=1 原文就不拷贝了.留个网址
- FT_ND_API.dll
ePass1000ND https://blog.csdn.net/li34442779/article/details/44276989 https://www.cnblogs.com/lidabo ...
- 数据库mysql之慢查询优化
今天项目遇到一个问题:就是在公司test环境中执行sql查询语句很快,也就几百毫秒,但是放到sit环境中测试就要延迟至少1分钟左右. 网上找了很多原因,大多数都是说索引问题,我看了索引没问题,又重新建 ...
- powerDesigner 正向工程生成sql注释
找到script-->objects-->column-->add value内容如下: %:COLUMN% %:DATATYPE%[.Z:[%Compressed%? compre ...
- 关于java poi itext生成pdf文件的例子以及方法
最近正在做导出pdf文件的功能,所以查了了一些相关资料,发现不是很完善,这里做一些小小的感想,欢迎各位“猿”童鞋批评指正. poi+itext,所需要的jar包有itext-2.1.7.jar,poi ...
- UVaLive 5760 Alice and Bob (博弈 + 记忆化搜索)
题意:有 n 堆石子,有两种操作,一种是从一堆中拿走一个,另一种是把两堆合并起来,Alice 先拿,谁不能拿了谁输,问谁胜. 析:某些堆石子数量为 1 是特殊,石子数量大于 1 个的都合并起来,再拿, ...
- 关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结
poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产生内存溢出问题,SXSSFWorkbook是一种大数据量导出格式,csv是另一种excel导出的一种轻快的 ...
- HashMap TreeMap的区别
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复就覆盖了),但允许值重复.Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快 ...
- 【pycharm 警告】unittest RuntimeWarning: Parent module ” not found while handling absolute import
Pycharm 2016.2执行单元测试遇到如下问题: RuntimeWarning: Parent module ‘YOUR_MODULE_HERE’ not found while handlin ...