11.Container With Most Water---两指针
2024-08-22 18:59:13
题目链接:https://leetcode.com/problems/container-with-most-water/description/
题目大意:给出一串数组(a1, a2, a3, ...an),表示坐标(i, ai),同样表示一条直线是从(i, 0)到(i, ai),从中选出两条直线,计算其容器能蓄水多少,并找出最多的蓄水量。(容器不能倾斜,就是两条直线可以是不同高度,但是蓄水量要按照低高度的那条直线来计算),例子如下:
法一:暴力,对于一条直线,分别遍历左边和右边直线,计算其蓄水量,取最大者。可惜超时了。代码如下:
public int maxArea(int[] height) {
int res = 0;
for(int i = 0; i < height.length; i++) {
//计算左边直线
for(int j = height.length - 1; j > i; j--) {
if(height[j] >= height[i]) {
res = Math.max(res, (j - i) * height[i]);
break;
}
}
//计算右边直线
for(int j = 0; j < i; j++) {
if(height[j] >= height[i]) {
res = Math.max(res, (i - j) * height[i]);
break;
}
}
}
return res;
}
法二:两指针移动,与42题的两指针移动类似但略有区别,左指针与右指针相比较,记录较大者,若左指针较小,则从左往右移动,若右指针较小,则从右往左移动,如果当前值比较大者大,则计算:(较大者下标-当前值下标)*当前值高度,计算得到最后的结果。代码如下(耗时8ms):
public int maxArea(int[] height) {
int res = 0, left = 0, right = height.length - 1;
while(left < right) {
//如果左指针<=右指针
if(height[left] <= height[right]) {
while(left < right && height[left] <= height[right]) {
res = Math.max(res, (right - left) * height[left++]);
}
}
//如果左指针>右指针
else {
while(left < right && height[left] > height[right]) {
res = Math.max(res, (right - left) * height[right--]);
}
}
}
return res;
}
最新文章
- PHP日志压缩下载
- 简单理解JavaScript闭包
- JRebel for Android 1.0发布!
- win8 64位系统,安装JDK的步骤及其环境配置
- Syslog Cisco Incident
- 从XML文件乱码问题,探寻其背后的原理(转)
- Memcached源码分析之items.c
- Django入门(一)
- HBase 数据库检索性能优化策略--转
- include指令和include动作
- codeforces-1144 (div3)
- 07_mysql常用sql语句
- P4550 收集邮票-洛谷luogu
- centos 6.5 ruby环境安装
- JAVA 类的三大特性,封装,继承,多态 的一些发现总结
- confusing c++ 重写 与 重定义 记录1
- Dos命令的介绍
- svn检出项目后,serverlet包 报错
- linux后台运行jar程序
- Socket通信编程实例(SIB和SS&#39;SOB)
热门文章
- BZOJ3875 AHOI2014/JSOI2014骑士游戏(动态规划)
- Java之JNI的介绍与应用20170622
- 关于EMGU CV的那些事——1.环境搭建(win8 vs2012 emgucv3.0)
- Codeforces Round #416 (Div. 2)A B C 水 暴力 dp
- C++并发编程 thread
- 「Linux」VMware安装centos7(二)
- django 配置xamdin遇到的坑
- DialogFragment 将数据传回Activity的onActivityResult方法
- HTML入门(三)后台系统显示页面_框架标签
- 重构改善既有代码设计--重构手法14:Hide Delegate (隐藏委托关系)