# 26. 删除排序数组中的重复项
# 题目:
给你 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
# 解题思路
对于这种情境化的一些题目,我们需要先将其转化为我们更加容易理解的算法或者程序语言。比如这里我们要求容器能够容纳的最多的水, 那么我们肯定需要知道容器容纳的水是怎么计算的?容器能够容纳的水实际上就是水平方向的长度乘以垂直方向的高度。水平方向的长度就是 两个元素下标的差值,垂直方向的高度实际上就是两个值中的最小值。也就是说,这个题目可以用通俗易懂的语言解释为: 给定一个数组,求数组中所有任意两个元素之间的下标差值和两个元素的最小值的乘积的最大值。因此,具体的实现思路如下:
- 数组中任意两个元素的下标差值x
- 数组中任意两个元素比较的最小值y。
- 求得所有的x*y,并找出他们的最大值。
# 代码
暴力破解法
/**
* @param {number[]} height
* @return {number}
*/
var height = [1,8,6,2,5,4,8,3,7];
var maxArea = function(height) {
var max = 0;
for(var i = 0;i < height.length;i++){
for(var j = i+1;j < height.length;j++){
// 最小值 * 下标差值
var result = Math.min( height[j] , height[i] ) * (j - i);
if(result > max) max = result;
}
}
return max;
};
暴力破解法就是按照我们的分析思路,通过两层for循环,找到最小值乘以下标差值然后找出最大值即可。
但是middle难度的题目,使用了O(n2),显然不能这么做,我们应该找到更加简单的实现算法。
改进方法