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 ...
随机推荐
- 记一次Django报错Reverse for 'indextwo' with no arguments not found. 1 pattern(s) tried: ['$index/$']
启动python manage.py runserver 打开127.0.0.1:8000,报错信息如下: Reverse for 'indextwo' with no arguments not f ...
- C++ 提取网页内容系列之三
标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171659.html 欢迎转帖 请保持文本完整并注明出处 这次继续下载 ...
- SQL里执行CLR c#代码
这里只说一个重点: 1.直接在sql里执行clr代码的时候,sql还是会报错 说没有启用 clr 执行以下代码才会起作用 EXEC sp_configure 'clr enabled', 1; RE ...
- 连接hive
bin/hiveserver2 nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err & ...
- c#new和override
new是覆盖父类的虚方法,当用子类构造方法构造父类对象时调用该虚方法调的是父类的方法(视为子类屏蔽了父类的方法,没实现,还是调用父类的方法). override是重写父类的虚方法,当用子类构造方法构造 ...
- Kali proxychains
1.什么是proxychains 在linux系统中有很多软件是不支持代理的,但是proxychains 却可以让不支持代理的软件 也能走代理通道,支持HTTP,HTTPS,SOCKS4,SOCKS5 ...
- A - ACboy needs your help again!
ACboy was kidnapped!! he miss his mother very much and is very scare now.You can't image how dark th ...
- Spring 的属性注入
一.注入方式 (1)set方法注入 (2)构造函数注入 (3)p名称空间注入 (4)spel注入 二.复杂类型注入
- drf4 视图与路由组件
APIView和View的区别 不管是View还是APIView最开始调用的都是as_view() APIView继承了View, 并且执行了View中的as_view()方法,最后把view返回了, ...
- jquery监听滚动条
$(".lx").scroll(function(){ var $this =$(this), viewH =$(this).height(),//可见高度 contentH =$ ...