今天把上次理解错题目的题做了一下,感觉自己一点点找回了有关数组的一些函数知识,很棒~~~~
题目是盛最多水的容器;
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

试试图片有没有

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入: [1,8,6,2,5,4,8,3,7]

输出:49

解释:

在该数组中,8和7组成盛水的最大面积,该面积计算方法是7所在的数组位置8,减去8所在的数组位置1,再乘以两个数中较小的那个,也就是(8-1)*7=49。输出49。

题解:

读完该题,我的第一想法是先找到最大值,保持不变,在遍历剩下数值求最大面积,后来发现这样行不通,满足所有示例写起来有点麻烦,所以之后采用了双指针,i指针初始指向数组位置0,j指针初始指向数组位置n-1;两个指针对应的数值进行比较,大的保持指针位置不变,小的则向后,或者向前进行遍历,i<j。
除此之外,还用到了java中的Math.max(int,int)函数。该函数返回两个比较的最大值,我们通过该函数来更新面积的最大值。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package solution;

import java.util.*;
import java.math.*;

class solution {
public int maxArea(int[] height) {
int n = height.length;
int min = 0;
int result = 0;
for (int i = 0, j = n - 1; i < j;) {
if (height[i] < height[j]) {
min = height[i];
i++;
} else {
min = height[j];
j--;
}
result = Math.max(result, (j - i + 1) * min);
}
return result;
}

public static void main(String[] args) {
solution s = new solution();
int[] b = { 1, 8, 6, 2, 5, 4, 8, 3, 7 };
System.out.print(s.maxArea(b));

}
}