LeetCode第[11]题(Java):Container With Most Water (数组容器盛水)——Medium
题目难度:Medium
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 and n is at least 2.
翻译:
给定n个非负整数a1 a2....an,每个代表一个坐标点(i,ai)。
n垂直的线是这样画的:直线i的两个端点为(i,ai)和(i,0),两条竖线和x轴形成一个容器,找到使容器包含最多的水的两条,返回水的体积。
注意:不能倾斜容器,n至少是2。
思路:遍历每一种可能的体积,与一个temp值相比较,比temp大则temp等于这个体积
思路一Code:48 / 49 test cases passed. —— Time Limit Exceeded 时间复杂度O(N2)
public int maxArea(int[] height) {
int result = 0;
for (int i = 0; i < height.length; i++) {
for (int j = i + 1; j < height.length;j++) {
int area = getMin(height[i], height[j]) * (j - i);
if (area > result) {
result = area;
}
}
}
return result;
}
private int getMin(int a, int b) {
return a>b?b:a;
}
我承认这种方法是蠢了点,但是貌似没毛病啊,怎么会超时?
点开detail一看49的测试用例。。。。
[15000,14999,14998,14997,........[此处省略n万个数字]........,6004,6003,6002,600... 28895 more chars
emmm……
我去你妹妹的吻。。。
带着去瞻仰的心情点开了solution……
我那个区,我咋就没想到!。。。
答案思路:从两边的“木板”向中间同时移动,取两条木板面积,与一个temp值相比较,比temp大则temp等于这个体积
【精髓在于:假设已知一木板X已经比对面的木板Y要长,那么根据短板效应(底面积不变大时,容器盛水容量取决于短板长度),不管怎么继续往前移动(缩小底面积)此X木板,得到的结果也不会比刚才X与Y组合的结果更大。
因此,从两边取两条“木板”时,只需要移动相对短的直线的那一边的指针即可达到寻找最大面积的效果】
Code:49测试用例—9ms(beats 69.61%) 时间复杂度:O(N)
public static int maxArea2(int[] height) {
int maxarea = 0, l = 0, r = height.length - 1;
while (l < r) {
maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
if (height[l] < height[r])
l++;
else
r--;
}
return maxarea;
}
总结:面对求最大(小)面积、体积这种题,应该要考虑刷选遍历可能结果,即某些相对更小(大)的可能结果已经确定小于(大于)在已经遍历过的结果里了(利用短板效应,和公共边效应等)
例如本题中,如果进行全遍历,那么在一边木板本来就是比对面高的情况下,不管怎么继续往前移动此木板,得到的结果只会比刚才的结果更小,强行全遍历就造成了遍历冗余。
【补:求两者最大值最小值可使用Math包的方法,其实底层和我写的一样都是三目表达式(以后使用记得加括号,因为这种表达式是靠左优先),不过可以简化代码,增加可读性】
LeetCode第[11]题(Java):Container With Most Water (数组容器盛水)——Medium的更多相关文章
- LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD
题目:接雨水 难度:hard 题目内容: Given n non-negative integers representing an elevation map where the width of ...
- LeetCode第[11]题(Java):Container With Most Water 标签:Array
题目难度:Medium Given n non-negative integers a1, a2, ..., an, where each represents a point at coordina ...
- 【LeetCode每天一题】Container With Most Water(容器中最多的水)
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...
- LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium
题目难度:Medium 题目: You are given two non-empty linked lists representing two non-negative integers. The ...
- LeetCode第[18]题(Java):4Sum 标签:Array
题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...
- LeetCode第[1]题(Java):Two Sum 标签:Array
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2
题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...
- LeetCode第[1]题(Java):Two Sum (俩数和为目标数的下标)——EASY
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- [LeetCode每日一题]88. 合并两个有序数组
[LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...
随机推荐
- 接口测试工具 — jmeter(header与cookie的添加)
1.header的添加 添加HTTP信息头管理器 填写header 2.添加cookie 添加HTTP Cookie管理器 添加cookie值
- vue-router 中 meta的用法
vue-router中的meta,也就是类似于面包屑的功能 路由 代码 用这个获取 嗯,就酱~~ 参考链接:https://blog.csdn.net/qq_32963841/article/deta ...
- Log4j:log4j.properties 配置解析
Log4j 三个主要组件 Loggers(记录器):记录日志的工具,程序中就是用它来记录我们想要的日志信息. Appenders (输出源):日志输出到什么地方,可以是控制台.文件.流位置.数据库,等 ...
- Scrapy(爬虫)基本运行机制
Scrapy(爬虫)基本运行机制
- Linux(3)- 用户管理、文件与目录权限、常用命令、Linux软件包管理
一.用户管理 现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以为多个用户建立账户,一般这些用户都是为普通用户,这些普通用户能同时登录这台计算机,计算机对这些用户分配一定的资源. 普通用户 ...
- MySQL按时间查找
RecentMutations表的结构如图,现在的需求是需要查找到2017年09月08日前10天的变体总数: SQL语句:SELECT SUM(MutantNumber) FROM RecentMut ...
- 004-安装CentOS7后需要的操作
1 安装EPEL源 EPEL即Extra Packages for Enterprise Linux,是基于Fedora的一个项目,为红帽系的操作系统提供额外的软件包,适用于RHEL.CentOS和S ...
- Ubuntu 16.04安装JDK并配置环境变量(转发:https://blog.csdn.net/yan3013216087/article/details/78307258)
系统版本:Ubuntu 16.04 JDK版本:jdk1.8.0_121 1.官网下载JDK文件jdk-8u121-linux-x64.tar.gz 我这里下的是最新版,其他版本也可以 2.创建一个目 ...
- Redis三(List操作)
List操作 redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name,values) 1 2 3 4 5 6 7 8 # 在name对应的list中添加元 ...
- Django-MTV(Day66)
阅读目录 Django基本命令 视图层路由配置系统 视图层之视图函数 MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模板):负 ...