给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
java解题思路:(贪心算法/贪婪算法,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。)
首先假设最优解是start=0,end=height.length--,即长度最长的部分。这个时候,如果要向内遍历,即长度变短,只能增加容器的宽度,即高度y。所以,如果start的长度大于end的长度,保持start不变,end--,得到的结果与上一结果比较。(即只考虑局部最优解)
public static int maxArea(int[] height) {
int max_area = 0;
int temp = 0;
int max_height = 0;
int start = 0, end = height.length - 1;// 定义两个指针
while (start < end) {
temp = (end - start) * Math.min(height[end], height[start]);
max_area = max_area > temp ? max_area : temp;
if (height[start] > height[end]) {
end--;
} else {
start++;
}
}
return max_area;
}