原题: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.
大意:给你n个点,每个点表示直线(i,0)(i,n),i为第i个点。选取两条直线组成一个容器。求容器的最多能够装多少水。
丫丫的,这个英文题干描述看了半天也看不懂说的是什么意思。百度了一下才知道最后要返回水的最大体积。不知道是题目坑还是我坑。~(>_<)~
先说思路:
引用前辈的解析:
设置两个指针i, j, 一头一尾, 相向而行. 假设i指向的挡板较低, j指向的挡板较高(height[i] < height[j]).
下一步移动哪个指针?
– 若移动j, 无论height[j-1]是何种高度, 形成的面积都小于之前的面积.
– 若移动i, 若height[i+1] <= height[i], 面积一定缩小; 但若height[i+1] > height[i], 面积则有可能增大.
综上, 应该移动指向较低挡板的那个指针.
上面这些说完,开始正题。
注意以下代码:
int i = 0, j = height.length - 1;
int count = 0, mini = 0;
while (i < j) {
/**
* 就是这一句
*/
mini = height[i] < height[j] ? height[i] : height[j];
count = count > (mini * (j - i)) ? count : (mini * (j - i));
if (height[i] < height[j]) {
i++;
} else {
j--;
}
}
return count;
以上是beats 42%。
假如改为:
//即在while循环中每次都初始化int型变量
int mini = height[i] < height[j] ? height[i] : height[j];
结果就是超时。因为初始化变量比较耗时,所以尽量避免在循环中多次初始化同一个变量
假如改为:
//即在while循环中调用函数
mini=Math.min(height[i],height[j]);
结果虽然通过,但是仅为beats 10%。因为调用函数比较耗时,所以在循环中尽量使用普通运算代替简单的函数调用。