leetcode —— 11 : 盛水最多的容器
题目要求
题解思路
官方双指针法题解思路
参考官方双指针法:
- 容器的容积为bottom*height
- height为最小的边长
- 相对于边长的大小来说,底部的长度bottom的变化很小,看作不变
- 初始时以首尾两个高度作为边长。
- 由于容积只受限于较短边长,依数组元素顺序循环将较短变长替换。
最初我们考虑由最外围两条线段构成的区域。现在,为了使面积最大化,我们需要考虑更长的两条线段之间的区域。如果我们试图将指向较长线段的指针向内侧移动,矩形区域的面积将受限于较短的线段而不会获得任何增加。但是,在同样的条件下,移动指向较短线段的指针尽管造成了矩形宽度的减小,但却可能会有助于面积的增大。因为移动较短线段的指针会得到一条相对较长的线段,这可以克服由宽度减小而引起的面积减小。
实现代码
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function(height) {
let head = 0,
tail = height.length-1,
altitude = 0,
bottom = 0,
capacity = 0;
let result = 0;
for(;head!==tail;height[head]>height[tail]?tail--:head++){
altitude = Math.min(height[head], height[tail]);
bottom = tail - head;
capacity = altitude * bottom;
result = Math.max(result,capacity);
}
return result;
};
代码效率
## 收获
- 灵活使用Math对象提供的方法,完成简单的计算
- 理解题目,在实际生产中可能会有哪些应用。
问题
- 不可能将所有的算法题目都做过一遍,并且完全记住。应该如何更有效率地学习算法呢?
- 如何总结出题目蕴含的模式,并将其应用到其他相似的题目之上?
来源:https://blog.csdn.net/CDTZYXZZY/article/details/99546321