Hot100-盛最多水的容器(11)
·
其实这个题目挺简单的,就是把想法落实到代码中即可可以通过暴力方法强行解出来,无非就是最短的乘一个索引差值。
这个是我一开始暴力出来的代码,我想着不就是判断一下两个柱子谁短,让短的一边去计算出面积就行了,但是运行时间太长了5ms。

class Solution {
public int maxArea(int[] height) {
int areaMax = 0;
int area = 0;
for (int i = 0; i < height.length; i++) {
int temp = height[i];
for (int j = height.length - 1; j > i; j--) {
if (height[j] > temp) {
area = (j - i) * temp;
if(area>areaMax){
areaMax = area;
}
break;
} else {
area = (j - i) * height[j];
if(area>areaMax){
areaMax = area;
}
}
}
}
return areaMax;
}
}
过了一个多月我才重新做这个题目,我去学习了一下双指针,后面我发现一个问题,比如第一个柱子比其他的柱子都短,那既然这样我还有必要去计算中间的面积吗。
后面我梦到啥就写啥,既然没必要计算中间的了,反正是左指针和右指针,左边比右边最远的柱子短计算完后直接让左指针加一就行了,但是又发现了个问题,如果左边的比右边的长咋办,这个没办法跳了。
class Solution {
public int maxArea(int[] height) {
int leftPoint = 0;
int rightPoint = height.length-1;
int max = 0;
int area = 0;
while (leftPoint < height.length-1){
if(height[leftPoint] <= height[rightPoint]){
max = height[leftPoint] * (rightPoint -leftPoint);
leftPoint++;
rightPoint = height.length-1;
}else {
if(height[rightPoint] == height[leftPoint]){
leftPoint++;
rightPoint = height.length-1;
}
max = height[rightPoint] * (rightPoint - leftPoint);
rightPoint--;
}
if(max>area){
area = max;
}
}
return area;
}
}
后面我就去看答案了,我居然不会用Math.min。
我想到了跳跃的思路,但是感觉实现起来有点麻烦,没想到Math.min这个工具方法这么好。
class Solution {
public int maxArea(int[] height) {
int leftPoint = 0;
int rightPoint = height.length-1;
int area = 0;
int temp = 0;
int min =0;
for (int i = 0; i < height.length; i++) {
min = Math.min(height[leftPoint], height[rightPoint]);
temp = min *(rightPoint -leftPoint);
if (height[leftPoint] > height[rightPoint]) {
rightPoint--;
}else {
leftPoint++;
}
if (temp > area) {
area = temp;
}
}
return area;
}
}
更多推荐



所有评论(0)